基于列值删除重复项-linq

13

我有一个员工和组之间的多对多关系。以下是LINQ语句:

int[] GroupIDs = {6,7};


var result = from g in umGroups
    join empGroup in umEmployeeGroups on g.GroupID equals empGroup.GroupID
    where  GroupIDs.Contains(g.GroupID)                     
    select new {  GrpId = g.GroupID,EmployeeID = empGroup.EmployeeID };

返回groupid和employeeid。结果是:

GrpId  | EmployeeID
6      |   18
6      |   20  
7      |   19
7      |   20

我需要删除那些employeeid重复的行,例如任何一个employeeid=20的行。
谢谢。


它会删除最后一行而不是GrpId = 6的那一行? - Jon Skeet
好的,我需要具有不同Employeeids的结果,可以删除任何一个。 - Tassadaque
1个回答

42

好的,如果你不在意移除哪个雇员,你可以尝试以下方法:

var result = query.GroupBy(x => x.EmployeeId)
                  .Select(group => group.First());

你没有说明这是在LINQ to SQL、LINQ to Objects还是其他什么地方...我不知道这个的SQL翻译是什么。如果你处理的数据量相对较小,你可以强制将最后一部分在进程内完成:

var result = query.AsEnumerable()
                  .GroupBy(x => x.EmployeeId)
                  .Select(group => group.First());

此时你可以使用MoreLINQ,它有一个方便的DistinctBy方法:

var result = query.AsEnumerable()
                  .DistinctBy(x => x.EmployeeId);

只是出于好奇,如果我想根据groupid删除特定行,该怎么办? - Tassadaque
1
@Tassadaque:你需要提供更多关于你想要的细节 - 但你可能可以使用ExceptWhere - Jon Skeet
这是一个很棒的扩展! - d219
已经成功了,谢谢。 - Uthen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接