我有一个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();
这是可能的,还是我应该寻找一种新方法?
答案 0 :(得分:7)
尝试合并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();
答案 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()
。