2015-03-21 2 views
0

У меня есть много-ко-многим, как это:LINQ все не работает, как ожидалось при использовании Содержит

организации (OrganisationID, Имя)
Категории (CategoryID, имя)
Organisations_Categories (OrganisationID, CategoryID)

Я пытаюсь получить список организаций, которые принадлежат все категорий, которые получают переданные в качестве параметра

например Если 10 организаций принадлежат CategoryID = 1 и 0 Организации принадлежат CategoryID = 2, и я передаю в [1,2] в качестве параметра CategoryID, 0 Организации должны быть возвращены, потому что 0 Организации принадлежат как CategoryID = 1, так и CategoryID = 2

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

int[] catIdsSelected = ((catIds.Length > 0) ? Array.ConvertAll(catIds.Split(','), int.Parse) : new int[0]); 

if (catIdsSelected.Length > 0) 
{ 
    orgs = orgs.Where(l => l.Categories.Any(m => catIdsSelected.AsQueryable().Contains(m.CategoryID))); 
} 

Однако это возвращает список организаций, которые принадлежат любой из категорий прошел в

Я попытался заменить «Любой» с «Все» без успеха

+0

Пожалуйста, попробуйте использовать Список catIdsSelected = .... и скажите мне результат. –

+0

Просто попробовал сделать его списком вместо IQueryable - тот же результат – user982119

+0

@ user982119, попробуйте изменить, где условие: 'orgs = orgs.Where (l => catIdsSelected.AsQueryable(). Все (ID => l.Categories.Any (ct => ct.CategoryID == ID))); ' – ASh

ответ

0

Вы можете сделать небольшой трюк:

if (catIdsSelected.Length > 0) 
{ 
    foreach (var id in carIdsSelected) 
    { 
     var localId = id; 
     orgs = orgs.Where(o => o.Categories.Any(cat => cat.CategoryId == localId)); 
    } 
} 

Он будет работать точно, но я не уверен, насколько эффективно запрос генерируется поставщиком EF.

+0

Это очень хорошо. Думаю, я бы подумал об этом в конце концов, спасибо большое :) – user982119

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