Существует ли "нет равных" в соединении linq

Я пытаюсь выполнить LINQ-запрос ниже, но мне нужно "не равно" вместо равного, так что у фильтруемых сотрудников есть все сотрудники из группы "минус группа".

List<Employee> groupA = getEmployeeA();
List<Employee> groupB = getEmployeeB();        

var filteredEmployees = from a in groupA 
                        join b in groupB on a.Name equals b.Name
                        select a;

Ответ 1

Для этого вам не требуется соединение:

var filteredEmployees = groupA.Except(groupB);

Обратите внимание, что это будет последовательность уникальных сотрудников - поэтому, если в groupA есть дубликаты, они будут отображаться только один раз в filteredEmployees. Разумеется, он также предполагает, что у вас есть разумный сопоставитель равенства 1. Если вам нужно специально указать имя, вы можете использовать ExceptBy из MoreLINQ:

var filteredEmployees = groupA.ExceptBy(groupB, employee => employee.Name);

Или не войдя в стороннюю библиотеку:

var groupBNames = new HashSet<string>(groupB.Select(x => x.Name));
var filteredEmployees = groupA.Where(x => !groupBNames.Contains(x.Name));

1 Как указано в комментариях, вы можете передать IEqualityComparer<T> в качестве аргумента Except. У меня есть класс ProjectionEqualityComparer в MiscUtil, который упрощает сборку такого рода, который вам нужен:

// I can't remember the exact method name, but it like this :)
var comparer = ProjectionEqualityComparer<Employee>.Create(x => x.Name);
var filteredEmployees = groupA.Except(groupB, comparer);

Ответ 2

Нет, оператор "не равен" доставит вам все комбинации groupA и groupB, кроме тех, где элементы были одинаковыми.

Используя метод Except, вы получите то, что хотите:

var filteredEmployees = groupA.Except(groupB);

Ответ 3

В Entity Framework 6 я получил лучшие результаты, используя

var filteredEmployees = groupA.Where(a => !groupB.Select(b => b.Name).Contains(a.Name));

Ответ 4

использовать из этого кода для снижения стоимости сервера:

Код работает очень быстро по сравнению с другим кодом

        var noExistList = (from n in groupA 
                                join o in groupA  on n.Id equals o.Id into p
                                where p.Count() == 0
                                select n).ToList();

примечание: groupA - это новый список для добавления.