Linq到NHibernate与ICriteria

时间:2009-07-31 09:44:05

标签: linq nhibernate c#-3.0

我一般使用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

,而

var criteria = session.CreateCriteria<InputItem>();
criteria.Add(Expression.Eq("Project", project));
criteria.SetMaxResults(1);
criteria.List();

给出

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是相同的。

2 个答案:

答案 0 :(得分:1)

我觉得好像NHibernate.Linq现在不支持这种优化。我认为您需要使用条件查询或HQL,或者等到完全集成的LINQ提供程序发布(我认为是NHib v3)。

干杯, 约翰

答案 1 :(得分:0)

您使用latest release吗?

我还没试过。但我不得不说,在尝试使用Linq-to-NHibernate时,我总是遇到问题。好吧,也许我对他们两个都太新手了...但是Linq应该是直观的,并且没有任何直觉可以从一个在HQL中完美运行的该死的简单查询中获取空引用。

但这是可以理解的,因为那是在发展中。我想,仍然是; - )