我通常经常使用 LINQ,尤其是 LINQ-to-Objects,因此我对 LINQ 相当熟练。
我正在考虑使用 LINQ-to-NHibernate 作为我的 NHibernate 项目的查询语言。当我编写一些测试时,我注意到 LINQ-to-NHibernate 不会进行与 ICriteria 相同的查询。由于我更喜欢使用 LINQ,我想问是否有人知道类似的差异,或者我是否应该不关心一般的性能(据我所知,高性能操作无论如何都需要使用 NHibernate 进行一些调整)它)。请参见以下示例:
var query = (from inputItem in session.Linq<InputItem>()
where inputItem.Project == project select inputItem).First();
给我以下 SQL:
SELECT this_.ID as ID0_1_, this_.Name as Name0_1_, this_.Project_id as Project3_0_1_, project1_.ID as ID1_0_, project1_.Name as Name1_0_
FROM "InputItem" this_ left outer join "Project" project1_ on this_.Project_id=project1_.ID
WHERE this_.Project_id = @p0 limit 1;@p0 = 1, @p1 = 1
whereas
var criteria = session.CreateCriteria<InputItem>();
criteria.Add(Expression.Eq("Project", project));
criteria.SetMaxResults(1);
criteria.List();
gives
SELECT this_.ID as ID0_0_, this_.Name as Name0_0_, this_.Project_id as Project3_0_0_
FROM "InputItem" this_
WHERE this_.Project_id = @p0 limit 1;@p0 = 1, @p1 = 1
显然,LEFT JOIN 是不必要的。
我的 LINQ 查询有问题还是只是一个限制?我应该首先担心它吗?
Icey
编辑:
我尝试将 LINQ 语句更改为以下内容:
var query = (from inputItem in session.Linq<InputItem>()
where inputItem.Project.ID == project.ID
select inputItem).First();
但生成的 SQL 是相同的。