2013-03-21 40 views
0

我使用ADO.NET EF與Code First方法。我正在使用:C#LINQ Distinct和ADO.NET EF

IList<SoleColor> soleColors = SoleColorService.All().ToList(); 

要獲取我的SoleColor表中的所有記錄的列表。剩下的就是要區分這些結果,因爲有這一列 - SoleCode,並且我只需要表中每組記錄中的一個記錄使用相同的SoleCode。我經歷了很多關於這個話題的文章,但這是我最後一次嘗試找到我認爲必須存在的解決方案。顯然

IList<SoleColor> soleColors = SoleColorService.All().Distinct.ToList(); 

不會因爲各種原因,但仍然工作 - soleColors持有的所有記錄/數據,我需要。我只需要多一步來過濾這些記錄/數據,以便每個SoleCode只保留一個。我不知道用簡單的LINQ或其他方式是否可以實現。我認爲(作爲新手)是,它似乎是一個非常標準的工作,應該不需要實施或重寫現有的方法,正如我在各個地方看到的解決方案。

那麼 - 有沒有一個標準的方法來做到這一點。如果不是這樣,至少在我看來,這並不罕見,所以我想在這種情況下有一個共同的方法來處理。

PS

這裏是我的實體與此相關的代碼:

public class SoleColor : Entity 
    { 
     [Required] 
     public long SoleID { get; set; } 
     public virtual Sole Sole { get; set; } 
     //Some code.. 
     [NotMapped] 
     public string SoleCode 
     { 
      get 
      { 
       if (Sole == null) 
        return string.Empty; 

       return Sole.Code; 
      } 
     } 
     //Some code... 

回答

3

您可以通過分組實現這一點:

:OP的編輯後

SoleColorService.All() 
       .GroupBy(x => x.SoleCode) 
       .Select(g => g.First()) 
       .ToList(); 

更新

由於SoleCode未映射,因此您必須使用此代碼:

SoleColorService.All() 
       .GroupBy(x => x.Sole == null ? string.Empty : x.Sole.Code) 
       .Select(g => g.First()) 
       .ToList(); 

這基本上重複查詢中SoleCode屬性的代碼。這不是很乾淨,因爲它違反了DRY
不違反DRY看起來像這樣的選擇:

SoleColorService.All() 
       .AsEnumerable() 
       .GroupBy(x => x.SoleCode) 
       .Select(g => g.First()) 
       .ToList(); 

但是,這有一個缺點,它會首先讀取數據庫中的所有行到您的應用程序的內存和執行有分組。您將不得不決定選擇哪種解決方案。如我所示,兩者都有缺點。

+0

這或自定義的''Distinct'' IEqualityComparer '。 :) – 2013-03-21 13:04:38

+0

@ Trustme-I'maDoctor:因爲這是數據庫,我不願意使用該過載。它將因供應商而異。 – 2013-03-21 13:06:40

+0

的確,我只是指出有*可能性*。我也會使用你列出的版本,特別是'只有一個屬性不同'。 – 2013-03-21 13:07:55