Дано:
var s = (from p in operatorList
select p.ID, p.Name,p.Phone)
Как я могу вернуть Distinct записи только на идентификаторе?
Дано:
var s = (from p in operatorList
select p.ID, p.Name,p.Phone)
Как я могу вернуть Distinct записи только на идентификаторе?
Вы можете написать IEqualityComparer
, который сравнивает значения ID
и передает его в перегруженный Queryable.Distinct метод, но поскольку это LINQ to SQL, он не будет поддерживаться в базе данных. Вам нужно будет добавить вызов метода AsEnumerable
, чтобы он работал, но это не рекомендуется для больших объемов данных, потому что вы будете приносить данные вплоть до клиентской стороны. Если вы решите пойти по этому маршруту, у вас будет запрос, похожий на:
var query = dc.Operators.AsEnumerable().Distinct(new OperatorEqualityComparer());
Другой вариант, который делает базу данных выполненной, состоит в группировке по ID
и занимает первый элемент в каждой группе:
var query = from p in dc.Operators
group p by p.ID into groups
select groups.First();
Если вы хотите добавить возможность сделать это как метод расширения, здесь вызывается метод DistinctBy
, который принимает в качестве источника и keySelector параметры и возвращает отдельный набор элементов. Он делает то же самое, что и второй запрос Ахмада, но выглядит немного красивее.
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
Затем назовите это:
var s = (from p in operatorList.DistinctBy(x => x.ID)
select p.ID, p.Name, p.Phone)