Учитывая следующую модель домена:
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) будет создавать операторы IN только из запросов Linq, если у вас есть список значений.Он никогда не создаст оператор IN ([подзапрос]), который просто не реализован.
Вы можете проголосовать за него здесь: https://nhibernate.jira.com/browse/NH-2899
Зачем вам нужен отбор?
Это очень просто.
from d in db.Dogs select d.Color
Вы можете сделать соединение:
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