如何选择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);
这可能行得通:
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