2011-11-01 77 views
3

鑑於以下域模型:NHibernate的LINQ的 - 如何選擇其中

Dog { Id, Name, Color } 

Color { Id, Name } 

如何獲得的顏色,其中有狗NHibernate.Linq。在SQL我會

SELECT Color.Id, Color.Name FROM Color 
    WHERE Id IN 
    (SELECT DISTINCT Dog.ColorId FROM Dog); 
+1

試試這個:顏色 。凡(C => 狗 。選擇(d => d.ColorId) 。載有(c.ColorId) ) – reggie

+0

好了 - 所以我的問題quering的原因我的對象圖,是我真的不應該 - 即使[Lukazoid的答案](http://stackoverflow.com/questions/7966207/nhibernate-linq-how-to-select-where-in/7966556# 7966556)的確是有效的,我最終使用'CreateSQLQuery'和之後的結果轉換器('SetResultTransofrmer')來模擬結構中的數據。 – mikkel

+0

from d in db.Dogs select d.Color – hazzik

回答

5

這可能會實現:

Colors.Where(c => Dogs.Any(d => d.Color.Equals(c))) 

然而,如果你對顏色識別純粹匹配,試試這個來代替:

Colors.Where(c => Dogs.Any(d => d.Color.Id == c.Id)) 

這些會給你所有的狗的顏色。

+0

+1但最好調用c1.Color.Equals(c2) –

+0

@SaeedAmiri好點,那麼可能的重寫Equals可能會使用標識符檢查是否相等。回覆更新我的帖子 – Lukazoid

0

你可以做一個加入:

from c in Color 
from d in dog 
WHERE d.ColorId == c.Id 
select c 

但是,這仍然是一個加入,讓你可以像它們試圖用一個查詢來獲取狗的顏色:

var dogColors = (from d in Dogs 
       select d.ColorId).Distinct().List() 

,然後得到的顏色:

from c in Color 
where dogColors.Contains(c.Id) 
select c 
1

NHibernate目前(3.2.0.GA)只能從Linq查詢創建IN語句,如果你有一個值列表ES。它永遠不會創建一個IN([subquery])語句,這只是沒有實現。

你可能想在這裏爲它投票:https://nhibernate.jira.com/browse/NH-2899

0

爲什麼你需要一個子查詢?

這是仙女簡單。

from d in db.Dogs 
select d.Color