鉴于以下域模型:
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);
答案 0 :(得分:5)
这可能有效:
Colors.Where(c => Dogs.Any(d => d.Color.Equals(c)))
但是,如果您纯粹根据颜色标识符进行匹配,请尝试以下方法:
Colors.Where(c => Dogs.Any(d => d.Color.Id == c.Id))
这些将为您提供狗使用的所有颜色。
答案 1 :(得分:1)
如果你有一个值列表,NHibernate目前(3.2.0.GA)只会从Linq查询创建IN语句。它永远不会创建一个IN([subquery])语句,它只是没有实现。
答案 2 :(得分: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
答案 3 :(得分:0)
为什么需要一个子选择?
这很简单。
from d in db.Dogs
select d.Color