NHibernate Linq - как выбрать ГДЕ В - PullRequest
3 голосов
/ 01 ноября 2011

Учитывая следующую модель домена:

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 ]

5 голосов
/ 01 ноября 2011

Это может сработать:

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

Однако, если вы соответствуете только по идентификатору цвета, попробуйте вместо этого:

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

Это даст вам все цвета, которые используются собаками.

1 голос
/ 02 ноября 2011

NHibernate в настоящее время (3.2.0.GA) будет создавать операторы IN только из запросов Linq, если у вас есть список значений.Он никогда не создаст оператор IN ([подзапрос]), который просто не реализован.

Вы можете проголосовать за него здесь: https://nhibernate.jira.com/browse/NH-2899

0 голосов
/ 31 января 2012

Зачем вам нужен отбор?

Это очень просто.

from d in db.Dogs 
select d.Color
0 голосов
/ 01 ноября 2011

Вы можете сделать соединение:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...