对某些行使用.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();
这可能吗?或者我应该寻找一种新的方式来做这件事吗?
尝试组合GroupBy
和First
:
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