2012-03-19 61 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();