2012-03-19 63 views
1

我有一个LINQ查询返回的所有存储在基于where子句的名单表中的数据的使用.Distinct():上的某些行

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(); 

这是可能的,或者我应该寻找这样的一种新的方式?

回答

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(); 
+0

只是一个调整,这一点:我不得不使用FirstOrDefault()作为第一个()抛出一个错误,但这个工作非常感谢!我也可以接受作为答案! – CallumVass 2012-03-19 12:56:12

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对象,我会使用MoreLINQ及其DistinctBy方法:

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