对某些行使用.Distinct()

本文关键字:Distinct | 更新日期: 2023-09-27 18:28:26

我有一个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();

这可能吗?或者我应该寻找一种新的方式来做这件事吗?

对某些行使用.Distinct()

尝试组合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();

这取决于上下文。如果这是在LINQ到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();

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

IEqualityComparer