我使用Fluent NHibernate进行了很简单的一对多映射,除了NH生成的查询不太理想之外,它工作正常。当我从NH检查sql日志时,我发现了这一点。
我正在寻找的查询就像
select p.*, c.* from parent p inner join child c on p.Id = c.parentId
其中p.ID是父表的PK,c.ParentId是子表中指向父表PK的FK。
但我从sql日志中发现的是这样的:
select P.* from Parent
后跟一堆针对子表运行的查询,如
select * from child c where c.ParentId = @p0
毫不奇怪,这会导致性能问题。
我的问题是为什么NH不会生成内部联接查询我认为它应该?我需要更改什么才能让NH生成所需的查询?
答案 0 :(得分:1)
JOIN不适用于此方案。它将生成SELECT,从而产生更多行,然后Parent
表具有。即:父项的每个子项将追加新行。
这里适当的解决方案是将这些选择分开。首先选择父项,然后为所有父项(仅选择父项)加载所有子项。 NHibernate确实有很好的解决方案:
这与你经历的有点相似。首先选择父母,然后选择孩子(ren)。最大的区别在于,我们现在分批为更多的孩子而不是1 + N
(分别针对每个儿童收藏)。所以它可能是1 + 2
批量大小映射的示例
1)Colleciton
HasMany<Child>(x => x.Children)
.BatchSize(25);
2)实体本身
public ChildMap()
{
Id(x => x....
...
BatchSize(25);
还有许多其他优势,其中PAGING是最赚钱的之一。因为我们正在使用公寓(而不是相乘)家长,我们可以应用.Take()
和.Skip()
最后,我们希望找到一些基于孩子的父母,我们可以在这种情况下使用子查询:15.8. Detached queries and subqueries