当我的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中消除了重复连接,那么这无关紧要。我发现在一些情况下,我认为生成的查询将是非常低效的,但经过优化后,它最终与看起来好得多的查询完全相同。