У меня есть две коллекции, которые имеют свойство Email
в обеих коллекциях. Мне нужно получить список элементов в первом списке, где Email
не существует во втором списке. С SQL я бы просто использовал «not in», но я не знаю эквивалента в LINQ. Как это сделать?
Пока у меня есть соединение, как ...
var matches = from item1 in list1
join item2 in list2 on item1.Email equals item2.Email
select new { Email = list1.Email };
Но я не могу присоединиться, потому что мне нужна разница, и соединение не удастся. Мне нужен какой-то способ использования Contains или Exists, которому я верю. Я просто еще не нашел пример, чтобы сделать это.
Ответы:
Я не знаю, поможет ли это вам, но ..
от Оговорка NOT IN в LINQ к SQL по Марко Руссо
источник
Вы хотите, кроме оператора.
Лучшее объяснение здесь: https://docs.microsoft.com/archive/blogs/charlie/linq-farm-more-on-set-operators
ПРИМЕЧАНИЕ. Этот метод лучше всего подходит только для примитивных типов, поскольку для использования метода со сложными типами необходимо реализовать IEqualityComparer
Except
.источник
list1.Select(item => new { Property1 = item.Property1, Property2 = item.Property2 }).Except(list2.Select( item => new { Property1 = item.Property1, Property2 = item.Property2 }));
это особенно полезно, когда вы определяете равенство, оценивая только набор значений сложного типа.IEquatityComparor<T,T>
или переопределять методы сравнения объектов вLinqToSql
сценарии; для, запрос будет представлен как / скомпилированный / выраженный как SQL; таким образом будут проверяться значения, а не ссылка на объект.except
I, я смог ускорить LINQ-запрос с 8-10 секунд до полсекундыДля людей, которые начинают с группы объектов в памяти и опрашивают базу данных, я считаю, что это лучший способ:
Это приводит к хорошему
WHERE ... IN (...)
предложению в SQL.источник
источник
Вы можете использовать комбинацию Where и Any для поиска не в:
источник
Вы можете взять обе коллекции в двух разных списках, скажем, list1 и list2.
Тогда просто пиши
Это будет работать
источник
В случае использования ADO.NET Entity Framework решение EchoStorm также отлично работает. Но мне потребовалось несколько минут, чтобы обернуть голову вокруг этого. Предполагая, что у вас есть контекст базы данных, dc, и вы хотите найти строки в таблице x, не связанные в таблице y, полный ответ ответа выглядит следующим образом:
В ответ на комментарий Энди, да, в запросе LINQ может быть два оператора from. Вот полный рабочий пример использования списков. Каждый класс, Foo и Bar, имеет идентификатор. Foo имеет ссылку "внешний ключ" на Bar через Foo.BarId. Программа выбирает все Foo, не связанные с соответствующим баром.
источник
источник
Можно также использовать
All()
источник
Хотя
Except
это часть ответа, это не весь ответ. По умолчаниюExcept
(как и некоторые операторы LINQ) выполняется сравнение ссылок на ссылочные типы. Чтобы сравнить по значениям в объектах, вам придетсяIEquatable<T>
в вашем типе, илиEquals
иGetHashCode
в вашем типе, илиIEqualityComparer<T>
для вашего типаисточник
Пример использования List of int для простоты.
источник
Для тех, кто также хочет использовать похожий на SQL
IN
оператор в C #, скачайте этот пакет:Есть
In
иNotIn
методы:Даже вы можете использовать это таким образом
источник
Спасибо, Бретт. Ваше предложение мне тоже помогло. У меня был список объектов, и я хотел отфильтровать его, используя другой список объектов. Еще раз спасибо....
Если кому-то нужно, посмотрите мой пример кода:
источник
Я не проверял это с LINQ to Entities :
В качестве альтернативы:
источник
Не могли бы вы выполнить внешнее объединение, выбрав только элементы из первого списка, если группа пуста? Что-то вроде:
Я не уверен, будет ли это работать каким-либо эффективным способом с платформой Entity.
источник
В качестве альтернативы вы можете сделать так:
источник