2011-06-07 83 views
1

我有一个问题,这个LINQ NHibernate的查询预先加载问题

var listeShopping = (from cart in session.Query<Cart>() 
    .Fetch(cart => cart.ItemShopping) 
    .ThenFetch(item => item.Manufacturer) 
    select cart.ItemShopping).ToList<ItemShopping>(); 

当我启动它我有一个奇怪的错误:

Query specified join fetching, but the owner of the fetched association was 
not present in the select list [FromElement{explicit,not a collection join, 
fetch join,fetch non-lazy properties,classAlias=_1,role=,tableName= (...) 

我需要预先加载,怎么能我避免了那个错误?如果可以提供帮助,我会提及我只使用内部连接表来使用购物车表。我只需要知道购物车中的ItemShopping。

问候

编辑

我修改了代码,使其在英语可读的。我纠正了错误。

编辑2

我发现方法,它似乎工作...有人可以检查它,如果我没有做错误?

 var list = (from item in session.Query<ItemShopping>() 
        .Fetch(item => item.Manufacturer) 
        from cart in item.Cart 
        select item).ToList<ItemShopping>(); 
+0

“select”中的“pan”定义在哪里? – Variant 2011-06-07 09:14:20

+0

您正在查询购物车,从潘选择的东西,并试图将其转换为项目购物列表...一些细节需要:) – Sly 2011-06-07 09:16:29

+0

我修改了代码...对不起! – 2011-06-07 09:25:32

回答

0

我不认为用Linq处理这种情况是不可能的。但它是与HQL:

var listeShopping = session.CreateQuery(@" 
    select item 
    from Cart cart 
    join cart.ItemShopping item 
    join fetch item.Manufacturer 
    ") 
    .List<ItemShopping>(); 

备注:渴望提取制造商这种方式不一定是最好的执行方法。请考虑在制造商类中使用batch-size

+0

为什么我应该使用批量大小而不是急切的加载?什么是赞成和反对?我按要求简化了,我有10个Fetch,而且我没有足够的体积来进行一些生产性能测试。 – 2011-06-07 13:15:45

+0

@PhilippeSohm:10取?你应该使用批量*和*缓存,而不是获取。使用批量大小允许针对每个实体类型进行小型,高效的查询,而使用多个读取语句会创建成本更高的大型连接。 – 2011-06-07 13:21:56

+0

Web应用程序缓存是否有效?如果我有一个像var items =(从会议(...)项目中选择项目),然后一个foreach(项目中的var项目)var data = item.Manufacturer.Name。批量大小是否有效? – 2011-06-07 13:28:11