2009-07-31 143 views
5

我一般使用LINQ,特別是LINQ到對象,因此我在LINQ中很流利。Linq to NHibernate vs. ICriteria

我正在考慮使用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是一樣的,雖然。

回答

1

它在我看來好像NHibernate.Linq現在不支持此優化。我認爲您需要使用標準查詢或HQL,或者等到完全集成的LINQ提供程序發佈(我認爲是針對NHib v3)。

乾杯, 約翰

+0

所以我認爲,我沒有犯任何明顯的錯誤。 – 2009-08-11 08:09:07

0

您是否使用latest release

我還沒有嘗試一下。但是我不得不說,在嘗試使用Linq-to-NHibernate時,我總是碰到問題。好吧,也許我對他們兩人都是新手......但是Linq應該是直觀的,而且從HQL中完美工作的一個該死的簡單查詢(就像你的那個)中獲取null引用沒有什麼直觀的。

但這是可以理解的,因爲那是在發展。並且仍然是,我想;-)

+1

是,我使用LINQ到NHibernate的1.0版本。順便說一句,我沒有得到空引用。唯一的地方,你可能會在這裏得到一個空引用異常,最後是First()。嘗試使用FirstOrDefault()。我想跳過HQL,因爲我真誠地憎恨魔術弦,無論哪裏都是可以避免的。 – 2009-08-05 13:10:46