Linq在特定领域的区别

时间:2011-05-12 21:39:05

标签: .net linq-to-sql

假设:

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

如何仅根据ID返回Distinct记录?

2 个答案:

答案 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作为参数并返回不同的项集。它与艾哈迈德的第二个查询完全相同,但内联看起来更漂亮。

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

然后这样打电话:

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