NHibernate Linq - 如何选择WHERE IN

时间:2011-11-01 12:10:37

标签: c# linq nhibernate

鉴于以下域模型:

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);

4 个答案:

答案 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])语句,它只是没有实现。

您可以在此投票:https://nhibernate.jira.com/browse/NH-2899

答案 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