Проблема Where
возвращает соответствующий элемент последовательность и, следовательно, результирующий тип является неправильным. Вот фундаментальная проблема:
// Wrong (type error)
from p in people
.Where(
// Results in type error as result of Where is Enumerable, not bool.
// The lambda signature is People => Enumerable[Award] which is
// incompatible with People => bool required for the outer Where.
a => a.Awards.Where(a => a.AwardID == 5)
)
select p
// Working - but NOT ideal as it forces materialization of the
// matching award count! However, types are correct.
from p in people
.Where(
// Now we get a lambda: People => bool
a => a.Awards.Where(a => a.AwardID == 5).Count() > 0
)
select p
Чем больше идеальным решением, чем это Where(f).Count() > 0
Any(f)
, как описано в других ответах. Помимо того, что более ясно, Any
также обычно выгоден, поскольку он не требует, чтобы последовательность была реализована в первую очередь - в конце концов, каждый элемент-источник мог бы соответствовать.
Фактический результат a Где будет IEnumerable[X]
или IQueryable[X]
в зависимости от источника, к которому он применяется. Дело в том, что где только одна приводит к несовместимой ценности и, следовательно, приводит к неправильной типизации лямбда.
на немного другой ноте, ваш класс лучше назван 'PersonDTO', чем люди. – nawfal