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



当我的select和where子句中有对同一表的引用时,linq to Nhibernate生成两个连接,一个用于select,一个用于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'

是否有一种方法来构建查询来获得这个?这有关系吗?

你可以通过使用一个透明的标识符来防止NHibernate这样做,这样你的查询看起来像这样:

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

您是否尝试过比较SSMS中每个查询的执行计划?如果在SQL Server中消除了重复连接,那么这无关紧要。我发现在一些情况下,我认为生成的查询将是非常低效的,但经过优化后,它最终与看起来好得多的查询完全相同。

相关内容

  • 没有找到相关文章

最新更新