Linq到NHibernate生成多个连接到同一个表

时间:2011-04-14 10:45:31

标签: sql linq nhibernate join

当我在我的where子句中选择同一个表时,linq到Nhibernate生成两个连接,一个用于选择,一个用于where。即。

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'

有没有办法构建查询来获取此信息? 这有关系吗?

2 个答案:

答案 0 :(得分: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
};

答案 1 :(得分:1)

您是否尝试过比较SSMS中的每个查询执行计划?如果在SQL Server中删除了重复的连接,则无关紧要。我发现在我认为生成的查询效率非常低的几个实例中就是这种情况,但在优化之后它最终与看起来的查询完全相同。