2011-05-12 14 views
10

Dane:LINQ Wyraźny na konkretnej dziedzinie

var s = (from p in operatorList      
    select p.ID, p.Name,p.Phone) 

Jak wrócę Wyraźną zapisy wyłącznie na podstawie identyfikatora?

+2

to pytanie jest podobny [usunąć zduplikowane oparty na kolumnie Wartość, LINQ] (http://stackoverflow.com/q/3446442/590956) – Sam

Odpowiedz

14

Można napisać IEqualityComparer, który porównuje wartości ID i przekazuje je do overloaded Queryable.Distinct method, ale ponieważ jest to LINQ do SQL, nie będzie obsługiwane w bazie danych. Aby to zadziałało, należy dodać wywołanie funkcji AsEnumerable method, ale nie jest to zalecane w przypadku dużych ilości danych, ponieważ dane byłyby przesyłane do klienta. Jeśli zdecydujesz się pójść tą drogą będzie można skończyć z kwerendy podobny do:

var query = dc.Operators.AsEnumerable().Distinct(new OperatorEqualityComparer()); 

inna opcja, która sprawia, że ​​baza do pracy, to do grupy przez ID i wziąć pierwszy element w każdej grupie:

var query = from p in dc.Operators 
      group p by p.ID into groups 
      select groups.First(); 
7

Jeśli chcesz dodać możliwość zrobić to jako metodę rozszerzenia, oto metoda zwana DistinctBy która odbywa się w źródle i keySelector jako parametry i zwraca odrębny zestaw poz. Robi to samo, co drugie zapytanie Ahmada, ale wygląda trochę ładniej w linii.

C#:
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
           this IEnumerable<TSource> source, 
           Func<TSource, TKey> keySelector) 
{ 
    return source.GroupBy(keySelector).Select(i => i.First()); 
} 
VB:
<Extension()> 
Public Function DistinctBy(Of TSource, TKey)(
        ByVal source As IEnumerable(Of TSource), 
        ByVal keySelector As Func(Of TSource, TKey)) 
        As IEnumerable(Of TSource) 

    Return source.GroupBy(keySelector).Select(Function(i) i.First()) 
End Function 

Następnie wywołać tak:

var s = (from p in operatorList.DistinctBy(x => x.ID)      
     select p.ID, p.Name, p.Phone) 
Powiązane problemy