假设:
var s = (from p in operatorList
select p.ID, p.Name,p.Phone)
如何仅根据ID返回Distinct记录?
答案 0 :(得分:14)
您可以编写一个IEqualityComparer
来比较ID
值并将其传递给overloaded Queryable.Distinct method,但由于这是LINQ to SQL,因此数据库不支持它。您必须添加对AsEnumerable
method的调用以使其正常工作,但不建议将其用于大量数据,因为您将把数据下载到客户端。如果您决定走这条路线,最终会得到类似于以下的查询:
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();
答案 1 :(得分:8)
如果你想添加这个作为扩展方法的能力,这里有一个名为DistinctBy
的方法,它接受source和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)