如何选择WHERE IN

本文关键字:WHERE IN 选择 何选择 | 更新日期: 2023-09-27 18:13:22

给定以下域模型:

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

如何选择WHERE IN

这可能行得通:

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

但是,如果您只匹配颜色标识符,请尝试这样做:

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

这些会给你所有的狗使用的颜色。

NHibernate目前(3.2.0.GA)只会从Linq查询中创建IN语句,如果你有一个值列表。它永远不会创建一个IN ([subquery])语句,这只是没有实现。

你可以在这里投票:https://nhibernate.jira.com/browse/NH-2899

您可以进行连接:

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

为什么需要子选择?

这很简单。

from d in db.Dogs 
select d.Color