2011-11-22 49 views
2

考慮下表:(流利)NHibernate的請在

tool 
*toolid 
*n other fields 

process 
*processid 
*n other fields 

toolprocess 
*toolprocessid 
*toolid 
*processid 
*n other fields 

當試圖選擇所有工具,適用於特定的過程中,我得到了幾千選擇上toolprocess在我的LINQ的看起來是這樣的:

from tool in tools 
where toolprocesses.Any(t=>t.Tool.Id==tool.Id) 
select tool 

其中toolprocesses包含toolprocesses具有相同的ProcessID列表

在SQL我只想寫

SELECT * FROM TOOL WHERE toolid IN 
    (SELECT TOOLID FROM TOOLPROCESS WHERE processid = 'someid'); 

它幾乎不需要花時間和預期

工作

我怎樣才能NHibernate的創建此查詢(或類似的東西)?

+0

你會使用QueryOver解決Exists問題嗎? – Phill

回答

1

嘗試

from t in Session.Query<Tool>() 
join tp in Session.Query<Toolprocess>() on t equals tp.Tool 
where tp.Process.Id == 'someid' 
select t; 

我假設你正在使用NH 3.x的這應該比Select ... Where ...在查詢中更快。

+0

感謝您的回覆,此結果首先在哪裏進行模糊調用。當我將它轉換爲此方法鏈時_session.Query ().Where(t => toolProcesses.Contains(t))我得到一個錯誤「類型不能從使用推斷」在包含,因爲它期望一個ToolProcess而不是一個工具 –

+0

好的,我對該列表做了誤讀。請參閱我的編輯。 –

+0

謝謝,這個竅門 –

3

我不知道你是否可以在Query中做到這一點,但你可以在QueryOver/Criteria中做到這一點。

在QueryOver它會是什麼樣子:

var subQuery = QueryOver.Of<Toolprocess>() 
         .Where(x => x.Process.Id == id) 
         .Select(x => x.Tool.Id); 

var result = session.QueryOver<Tool>() 
        .WithSubquery.WhereProperty(x => x.Id).In(subQuery) 
        .List(); 

http://www.philliphaydon.com/2010/09/28/queryover-with-nhibernate-3-lovin-it/

或者,如果你想要做的存在,而不是在,我在這裏的博客上講述它:

http://www.philliphaydon.com/2011/01/19/revisiting-exists-in-nhibernate-3-0-and-queryover/

+0

謝謝,當使用這個我得到一個不能解決WithSubQuery的符號錯誤。我是否需要引用一些我沒有通過使用NuGet安裝NHibernate 3.1.4? –

+0

@亞歷山大 - 對不起,它是WithSubquery,沒有資本Q. – Phill

+0

是的,這也可以。我更喜歡。存在,因爲它更高效。關於閱讀,不使用Exists或In總是更好。至少在你使用SQL Server的時候。 –