在某些行上使用.Distinct()

时间:2012-03-19 12:49:06

标签: c# linq entity-framework

我有一个Linq查询,它根据where子句作为列表返回存储在表中的所有数据:

List<Catalogue> data = context.Catalogue.Where(x=>x.ManID == id).ToList();

这会返回23个项目,但其中一些项目包含一些包含重复数据的列,我将其称为ColumnA,ColumnB和ColumnD。我试过了:

List<Catalogue> data = context.Catalogue.Where(x=>x.ManID == id)
                .Distinct().ToList();

但这只返回相同的23行。我想要的是,如果我可以指定我想要具有不同值的列,例如:

List<Catalogue> data = context.Catalogue.Where(x=>x.ManID == id)
                .Distinct(x=> new { x.ColumnA, x.ColumnB, x.ColumnD }).ToList();

这是可能的,还是我应该寻找一种新方法?

3 个答案:

答案 0 :(得分:7)

尝试合并GroupByFirst

List<Catalogue> data = context.Catalogue
    .Where(x => x.ManID == id)
    .GroupBy(x => new { x.ColumnA, x.ColumnB, x.ColumnD })
    .Select(g => g.First())
    .ToList();

答案 1 :(得分:2)

这取决于具体情况。如果这是在LINQ to SQL之类的内容,我会使用GroupBy

List<Catalogue> data = context.Catalogue
                              .Where(x=>x.ManID == id)
                              .GroupBy(x=> new { x.ColumnA, 
                                                 x.ColumnB, 
                                                 x.ColumnD })
                              .Select(g => g.First())
                              .ToList();

(编辑:请注意,使用First确实 应该在这里没问题 - 您不需要使用FirstOrDefault(),因为每个组必须至少有一个条目甚至存在。)

在LINQ to Objects中,我使用MoreLINQ及其DistinctBy方法:

List<Catalogue> data = context.Catalogue
                              .Where(x=>x.ManID == id)
                              .DistinctBy(x=> new { x.ColumnA, 
                                                    x.ColumnB, 
                                                    x.ColumnD })
                              .ToList();

答案 2 :(得分:0)

我会为可以与IEqualityComparer一起使用的3个属性创建Distinct()

IEqualityComparer