鑑於以下域模型: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);
鑑於以下域模型: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);
這可能會實現:
Colors.Where(c => Dogs.Any(d => d.Color.Equals(c)))
然而,如果你對顏色識別純粹匹配,試試這個來代替:
Colors.Where(c => Dogs.Any(d => d.Color.Id == c.Id))
這些會給你所有的狗的顏色。
+1但最好調用c1.Color.Equals(c2) –
@SaeedAmiri好點,那麼可能的重寫Equals可能會使用標識符檢查是否相等。回覆更新我的帖子 – Lukazoid
你可以做一個加入:
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
NHibernate目前(3.2.0.GA)只能從Linq查詢創建IN語句,如果你有一個值列表ES。它永遠不會創建一個IN([subquery])語句,這只是沒有實現。
你可能想在這裏爲它投票:https://nhibernate.jira.com/browse/NH-2899
爲什麼你需要一個子查詢?
這是仙女簡單。
from d in db.Dogs
select d.Color
試試這個:顏色 。凡(C => 狗 。選擇(d => d.ColorId) 。載有(c.ColorId) ) – reggie
好了 - 所以我的問題quering的原因我的對象圖,是我真的不應該 - 即使[Lukazoid的答案](http://stackoverflow.com/questions/7966207/nhibernate-linq-how-to-select-where-in/7966556# 7966556)的確是有效的,我最終使用'CreateSQLQuery'和之後的結果轉換器('SetResultTransofrmer')來模擬結構中的數據。 – mikkel
from d in db.Dogs select d.Color – hazzik