2014-01-31 3 views
-1

Я хочу получить все записи производителя в LINQ, используя соединение «многие-ко-многим».LINQ to Entities - где Muliple И предложение в запросе

Позволяет рассматривать

таблицу 'Item':

id | name 
---------- 
1 | A 
--------- 
2 | B 
-------- 
3 | C 
-------- 

Таблица 'Производитель':

ManufactuerId | Name 
------------------- 
1    | XYZ 
------------------- 
2    | ABC 
-------------------- 
3    | ZZZ 
---------------------- 

Таблица 'ManufacturerItem':

ManufacturerItemID | ManufacturerId | ItemId 
------------------------------------------- 
1     | 1    | 1 
------------------------------------------- 
2     | 1    | 2 
------------------------------------------- 
3     | 2    | 1 
------------------------------------------ 
4     | 3    | 2 
------------------------------------------ 
5     | 1    | 3 
------------------------------------------ 

Я хотел бы забрать записи изготовителем (-ами), у которого есть все предметы, которые я поставил. Итак, учитывая ввод {A, B}, я хотел бы получить выход XYZ Manufacturer.

+3

Как может 'ID' быть,' 1,2,3,4,5' в то же время? у вас не будет записей. – Habib

+0

Я обновил сообщение, пожалуйста, проверьте его –

+0

И еще один повторяющийся вопрос, ничего себе! http://stackoverflow.com/questions/21482801/linq-query-with-multiple-and-clause – walther

ответ

1
var tableItems = new[] { 
     new { Id = 1, Name = "A" }, 
     new { Id = 2, Name = "B" }, 
     new { Id = 3, Name = "C" } 
}; 

var tableManufacturer = new[] { 
    new { ManufacturerId = 1, Name = "XYZ" }, 
    new { ManufacturerId = 2, Name = "ABC" }, 
    new { ManufacturerId = 3, Name = "ZZZ" } 
}; 

var tableManufacturerItem = new[] 
{ 
    new {ManufacturerItemID = 1, ManufacturerId = 1, ItemId = 1}, 
    new {ManufacturerItemID = 2, ManufacturerId = 1, ItemId = 2}, 
    new {ManufacturerItemID = 3, ManufacturerId = 2, ItemId = 1}, 
    new {ManufacturerItemID = 4, ManufacturerId = 3, ItemId = 2}, 
    new {ManufacturerItemID = 5, ManufacturerId = 1, ItemId = 3}, 
}; 

var itemsToSearch = new[] { "A", "B" }; 

var result = tableManufacturerItem 
       .GroupBy(x => x.ManufacturerId) 
       .Where(m => tableItems.Where(item => itemsToSearch.Contains(item.Name)).Select(x => x.Id) 
             .Except(m.Select(x => x.ItemId)) 
             .Count() == 0) 
       .Select(x => tableManufacturer.First(m => m.ManufacturerId == x.Key)) 
       .Select(m => m.Name) 
       .ToList(); 
+0

Пожалуйста, не поощряйте лень здесь, спасибо. – walther

+2

@walther Я согласен, но, как вы можете видеть из ответа, это не так просто, как кажется. Поэтому я отправил ответ. Но ваш комментарий действителен для большинства подобных вопросов. –

+1

@ L.B Спасибо, что это работает .. –

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