鉴于:
var s = (from p in operatorList                       
    select p.ID, p.Name,p.Phone)
我如何仅根据ID返回Distinct记录?
Ahm*_*eed 14
您可以编写一个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,它接受source和keySelector作为参数并返回不同的项集.它与Ahmad的第二个查询完全相同,但看起来更漂亮.
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
                                this IEnumerable<TSource> source, 
                                Func<TSource, TKey> keySelector)
{
    return source.GroupBy(keySelector).Select(i => i.First());
}
<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)