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?
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?
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();
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.
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)
to pytanie jest podobny [usunąć zduplikowane oparty na kolumnie Wartość, LINQ] (http://stackoverflow.com/q/3446442/590956) – Sam