2013-03-21 2 views
0

Я использую ADO.NET EF с использованием кода 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

Вы можете достичь этого путем группировки:

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

Update после редактирования ОП:

Поскольку SoleCode не отображается, вы должны будете использовать этот код:

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

Это в основном повторяет код свойства SoleCode в запросе. Это не очень чисто, потому что это нарушает DRY.
Альтернатива, которая не нарушает СУХОЙ выглядит так:

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

Однако это имеет тот недостаток, что он будет первым выборки все строки из базы данных в памяти приложения и выполняет группировку там ,

Вам нужно будет решить, какое решение вы выберете. Как я показал, у обоих есть недостатки.

+0

Это, или 'Distinct' с пользовательским' IEqualityComparer '. :) –

+0

@ Trustme-I'maDoctor: Поскольку это происходит в базе данных, я не хочу использовать эту перегрузку. Это зависит от поставщиков. –

+0

Правда, я просто указываю, что есть * возможность *. Я бы использовал указанную вами версию, особенно для «отличной от одного свойства». –