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优化查询?我完全失去了。
非常感谢您的支持。
答
在你的包映射类尝试添加batch-size
<bag name="Products" batch-size="25" ...>
你能后的全品类映射? – Vadim 2011-01-22 18:21:30
我发现了一个更好的解决方案,可以从linq加载。如果有人感兴趣看看[这里](http://mikehadlow.blogspot.com/2010/08/nhibernate-linq-eager-fetching.html) – Davita 2011-01-23 13:13:06