问题
I am trying accomplish the LINQ query below but I need a "not equal" instead of equal, so that filteredEmployees has all employees from groupA minus groupB.
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:
You don't need a join for that:
var filteredEmployees = groupA.Except(groupB);
Note that this will be a sequence of unique employees - so if there are any duplicates in groupA
, they will only appear once in filteredEmployees
. Of course, it also assumes you've got a reasonable equality comparer1. If you need to go specifically on name, you can use ExceptBy from MoreLINQ:
var filteredEmployees = groupA.ExceptBy(groupB, employee => employee.Name);
Or without going into a third party library:
var groupBNames = new HashSet<string>(groupB.Select(x => x.Name));
var filteredEmployees = groupA.Where(x => !groupBNames.Contains(x.Name));
1 As pointed out in the comments, you can pass in an IEqualityComparer<T>
as an argument to Except
. I have a ProjectionEqualityComparer
class in MiscUtil which makes it easy to build a comparer of the kind you need:
// I can't remember the exact method name, but it's like this :)
var comparer = ProjectionEqualityComparer<Employee>.Create(x => x.Name);
var filteredEmployees = groupA.Except(groupB, comparer);
回答2:
No, a "not equal" operator would get you all combinations of groupA and groupB except the ones where the items were the same.
Using the Except method gets you what you want:
var filteredEmployees = groupA.Except(groupB);
回答3:
In Entity Framework 6, I've gotten better results using
var filteredEmployees = groupA.Where(a => !groupB.Select(b => b.Name).Contains(a.Name));
回答4:
use of this code for decreased server cost :
The code works very fast compared to other code
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();
note: groupA is a new list for add.
来源:https://stackoverflow.com/questions/3762869/is-there-a-not-equal-in-a-linq-join