2017-02-17 25 views
1

Я сражает с тем, что я думал, будет простой запрос ...LINQ Any() не работает, как ожидалось

Схема подобна:

Documents (DocumentID, Name)
Industries (IndustryID, имя)
Documents_Industries (DocumentID, IndustryID)

данных, как:

ДОКА - IndustryA
DocB - IndustryA, IndustryB
DOCC - IndustryA, IndustryB
DocD - IndustryB

(Таким образом, приведенные выше данные приведут к 6 строк в Documents_Industries, мы надеемся, что это сам -explanatory)

Ожидаемое поведение: Я пытаюсь показать список документов, отфильтрованных промышленностью (пользователями), которую пользователь выбирает. Если выбрана IndustryA, набор результатов должен быть DocA, DocB, DocC. Если выбрана IndustryB, набор результатов должен быть DocB, DocC, DocD. Если выбрана IndustryA и IndustryB, набор результатов должен быть DocB, DocC.

код до сих пор:

IEnumerable<Document> docs = db.Documents.Where(l => l.IsActive == true); 

// industryIdsSelected is an int[] from the user's selection 

if (industryIdsSelected.Length > 0) 
{ 
    docs = docs.Where(l => l.Industries.Any(m => industryIdsSelected.Contains(m.IndustryID))); 
} 

Фактическое поведение: Если IndustryA и IndustryB выбран, набор результатов ДОКА, DocB, DOCC, DocD. Вместо DocB, DocC.

Я пробовал с .All(), но это тоже не работает. Что я могу делать неправильно?

+4

Все было бы ближе, но было бы больше похоже на 'л => SelectedIndustries.All (т => m.Contains (...' – BradleyDotNET

+0

Вы используете много для многих, и если выбрана IndustryA и IndustryB, почему вы хотите исключить документ A и документ B. Они оба имеют эти отрасли. – kat1330

+0

@ kat1330, потому что это требование :). Фильтр пользователя больше И чем OR - «получить все документы, в которых есть обе эти отрасли». – user982119

ответ

2

Вы должны использовать оба All и Any так:

docs.Where(l => industryIdsSelected.All(x => l.Industries.Any(m => m.IndustryID == x))); 
+2

Вы избили меня на несколько секунд. Я собирался добавить, что это нормально, пока 'industryIdsSelected' не является« длинным »списком, потому что EF должен преобразовать список в временную таблицу (сортировки) в инструкции SQL. Но я думаю, что здесь все в порядке. –

+2

Вы увидите, когда вы проверите сгенерированный SQL. Список реконструируется с помощью команд 'n' select + union. –

+0

@GertArnold - Хорошая точка. Исходя из этого примера, я бы предположил, что для OP не должно быть проблем. – Aducci

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

  • Нет связанных вопросов^_^