NHibernate Linq。查询关联和多个SQL查询

问题描述:

我刚开始玩NHibernate Linq,发现一个奇怪的行为。我有一个班级类别和一个班级产品。类别包含具有一对多关联的产品列表。这里的映射:NHibernate Linq。查询关联和多个SQL查询

<class name="Category"> 
    <id name="Id"> 
     <generator class="hilo" /> 
    </id> 
    <property name="Name" lazy="false" length="20" /> 

    <bag name="Products" cascade="none" lazy="false" inverse="true" fetch="join"> 
     <key column="CategoryId" /> 
     <one-to-many class="Product" /> 
     <!--<filter name="IdFilter" />--> 
    </bag> 
    </class> 

    <class name="Product"> 
    <id name="Id"> 
     <generator class="hilo" /> 
    </id> 
    <property name="Name" lazy="false" /> 
    <property name="Discontinued" lazy="false" /> 
    <property name="Price" lazy="false" /> 
    <many-to-one name="Category" 
      class="Category" 
      column="CategoryId" 
      cascade="none" /> 
    </class> 

当我查询的类别与此查询

var cs = session.Query<Category>().Where(c => c.Products.Any(p => p.Price == 13.3392)).ToList(); 

我看NHibernate的探查,看到这个结果

select category0_.Id as Id1_, 
     category0_.Name as Name1_ 
from Category category0_ 
where exists (select products1_.Id 
       from Product products1_ 
       where category0_.Id = products1_.CategoryId 
         and products1_.Price = 13.3392 /* @p0 */) 

SELECT products0_.CategoryId as CategoryId1_, 
     products0_.Id   as Id1_, 
     products0_.Id   as Id0_0_, 
     products0_.Name   as Name0_0_, 
     products0_.Discontinued as Disconti3_0_0_, 
     products0_.Price  as Price0_0_, 
     products0_.CategoryId as CategoryId0_0_ 
FROM Product products0_ 
WHERE products0_.CategoryId = 131073 /* @p0 */ 

SELECT products0_.CategoryId as CategoryId1_, 
     products0_.Id   as Id1_, 
     products0_.Id   as Id0_0_, 
     products0_.Name   as Name0_0_, 
     products0_.Discontinued as Disconti3_0_0_, 
     products0_.Price  as Price0_0_, 
     products0_.CategoryId as CategoryId0_0_ 
FROM Product products0_ 
WHERE products0_.CategoryId = 32768 /* @p0 */ 

类别是一个从数据库中获取一个。所以到数据库的往返数量等于where子句匹配的类别对象的数量。

有没有办法告诉NHibernate优化查询?我完全失去了。

非常感谢您的支持。

+0

你能后的全品类映射? – Vadim 2011-01-22 18:21:30

+0

我发现了一个更好的解决方案,可以从linq加载。如果有人感兴趣看看[这里](http://mikehadlow.blogspot.com/2010/08/nhibernate-linq-eager-fetching.html) – Davita 2011-01-23 13:13:06

在你的包映射类尝试添加batch-size

<bag name="Products" batch-size="25" ...>