2013-05-16 3 views
0

У меня есть два списка Person и Product с общим, уникальным идентификатором. Я хочу получить записи в Product, чьи идентификаторы не соответствуют идентификаторам в Person. Каким должен быть запрос LINQ?LINQ, чтобы найти разницу в наборе на основе столбца

List<Person>:

ID Name 
1  Abc 
3  Xyz 

List<Product>:

ID Price 
3  400 
5  150 

Ожидаемый результат - список типов Product:

ID Price 
5  150 

ответ

7
var result = products.Where(p => !persons.Select(x => x.Id) 
             .Contains(p.Id)); 
+0

есть ли ' sql' как синтаксис для того же? – Nishanth

4
var persionIDs = new HashSet<int>(persons.Select(person => person.ID)); 
IEnumerable<Product> invalidProducts = 
       products.Where(product => !persionIDs.Contains(product.ID)); 

Использование HashSet оптимизирует поиск по лицу ID

3

Короткий подход

products.Where(product => !persons.Any(p => p.ID == product.ID)); 

Более эффективный подход с использованием Except и Join, которые используют Sets внутренне

from prod in products 
join pID in products.Select(p => p.ID).Except(persons.Select(pers => pers.ID)) 
on prod.ID equals pID 
select prod; 
Смежные вопросы