2013-06-15 3 views
0
class PeopleDTO 
{ 
    string Name { get; set; } 
    List<AwardDTO> Awards { get; set; } 
} 


class AwardDTO 
{ 
    int AwardID {get; set; } 
    string AwardName {get; set; } 
} 

Я пытаюсь использовать LINQ для фильтрации мои люди объект для тех, кто имеет «AwardID» равно 5. Я попытался следующие, но я не получаю это:комплекс DTO и LINQ

List<PeopleDTO> people = GetPeople(); 
var test = (from p in people.Where(a => a.Awards.Where(a => a.AwardID == 5)) select p).ToList(); 

Любые предложения?

+0

на немного другой ноте, ваш класс лучше назван 'PersonDTO', чем люди. – nawfal

ответ

2
people.Where(p=>p.Awards.Any(a=>a.AwardId == 5)).ToList() 
0

Вам нужно только одно небольшое изменение:

List<PeopleDTO> people = GetPeople(); 
var test = (from p in people.Where(a => a.Awards.Any(a => a.AwardID == 5)) select p).ToList(); 
0
var test = people.Where(l => l.Awards.Any(a => a.AwardId == 5)); 

бы .. Это только часть запроса, вы можете захотеть, чтобы выполнить его.

0

Проблема 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() > 0Any(f), как описано в других ответах. Помимо того, что более ясно, Any также обычно выгоден, поскольку он не требует, чтобы последовательность была реализована в первую очередь - в конце концов, каждый элемент-источник мог бы соответствовать.

Фактический результат a Где будет IEnumerable[X] или IQueryable[X] в зависимости от источника, к которому он применяется. Дело в том, что где только одна приводит к несовместимой ценности и, следовательно, приводит к неправильной типизации лямбда.

Смежные вопросы