Как мне упростить запрос LINQ с несколькими .Select (), чтобы вернуть IQueryable (int) - PullRequest
3 голосов
/ 20 января 2011

В запросе LINQ ниже я хочу вернуть идентификатор ContractorId, найденный в таблице «Подрядчики». Не все люди в таблице контактов находятся в таблице подрядчиков. Что я действительно хочу, так это список ContractorIds для тех подрядчиков, которые отвечают критериям. ContractorId не совпадает с ContactId.

var contractorsWithCertsFor2010 = dc.Contacts.Where(x => x.Contractors
.Any(d => d.ContractorStatus
.Any(date => date.StatusDate.Year >= 2010)))
.Select(x => x.Contractors
.Select(dr => dr.ContractorId)); 

IEnumerable<int> differenceQuery = allPeople.Except(contractorsWithCertsFor2010);

allPeople - это IQueryable<Int>, но подрядчики сCertsFor2010 - это IQueryable<IEnumerable<Int>>. Что-то не так. Множественный .Select () вызывает IQueryable<IEnumerable<Int>>, поэтому я ищу способ устранить один из .Select () и получить возврат

IQueryable<Int>

Есть предложения? Спасибо!

Решение: Одно решение опубликовано в ответе ниже. Я создал другое решение, прежде чем увидеть это. В моем решении я начал с таблицы «Подрядчики» вместо таблицы «Контакты», исключив один слой и один оператор .Select ().

Ответы [ 2 ]

4 голосов
/ 20 января 2011

Предполагая, что вам нужны только подрядчики, у которых есть контактная запись, и поскольку вы выбираете только идентификатор подрядчика, вы можете попробовать это:

var contractorsWithCertsFor2010 = dc.Contractors
    .Where(c => c.Contacts.Any() && c.ContractorStatus
        .Any(cs => cs.StatusDate.Year >= 2010))
    .Select(c => c.ContractorId);
3 голосов
/ 20 января 2011

Первая мысль: попробуйте SelectMany, чтобы сгладить результаты. Итак, идентичный код, кроме:

//...
.SelectMany(x => x.Contractors
                  .Select(dr => dr.ContractorId)); 

IEnumerable<int> differenceQuery = allPeople.Except(contractorsWithCertsFor2010);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...