2011-04-14 64 views
7

当我在select中的同一个表的引用和我的where子句时,linq到Nhibernate会生成两个连接,一个连接select,一个连接where。即Linq到NHibernate生成多个连接到同一个表

from child in Session.Query<Child>() 
where child.Parent.Name == "Bob" 
select new Info 
{ 
    ParentAge = child.Parent.Age, 
    ChildName = child.Name 
}; 

生成SQL这样的:

Select this_.Name, 
     parent1.Age 
From Child this_ 
    left join Parent parent1 on child.ParentId = parent1.Id, 
Parent parent2 

Where child.ParentId = parent2.Id and parent2.Name = 'Bob' 

我还以为我应该得到SQL更像是:

Select this_.Name, 
     parent1.Age 
From Child this_ 
     inner join Parent parent1 on child.ParentId = parent1.Id 
Where parent1.Name = 'Bob' 

有没有一种方法来构造查询得到这个? 重要吗?

+0

你怎么设置你的映射文件?你有没有设置cascade选项为false? – cpoDesign 2011-04-30 02:27:45

回答

1

您是否尝试过比较SSMS中的每个查询执行计划?如果在SQL Server中删除了重复的联接,则无关紧要。我发现在少数情况下,我认为生成的查询效率会非常低,但在优化后,它的结果与查询看起来好得多。

+0

感谢Joel,在这种情况下,SQL Server优化器肯定会为每个查询生成有效的执行计划,所以它并不重要。对于更复杂的情况,我可能只需要尝试一下并看看。 – 2011-04-21 08:48:50

4

您可以防止从NHibernate的用透明标识这样做,让您的查询看起来像这样:

from child in Session.Query<Child>() 
let p = child.Parent 
where p.Name == "Bob" 
select new Info { 
    ParentAge = p.Age, 
    ChildName = child.Name 
};