鉴于:
var s = (from p in operatorList
select p.ID, p.Name,p.Phone)
Run Code Online (Sandbox Code Playgroud)
我如何仅根据ID返回Distinct记录?
Ahm*_*eed 14
您可以编写一个IEqualityComparer
比较ID
值并将其传递给重载的Queryable.Distinct方法,但由于这是LINQ to SQL,因此数据库不支持它.您必须添加对AsEnumerable
方法的调用才能使其正常工作,但不建议将其用于大量数据,因为您要将数据下载到客户端.如果您决定走这条路线,您将得到类似于以下内容的查询:
var query = dc.Operators.AsEnumerable().Distinct(new OperatorEqualityComparer());
Run Code Online (Sandbox Code Playgroud)
使数据库完成工作的另一个选项是分组ID
并获取每个组中的第一个项目:
var query = from p in dc.Operators
group p by p.ID into groups
select groups.First();
Run Code Online (Sandbox Code Playgroud)
如果你想添加这个作为扩展方法的能力,这里有一个方法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());
}
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
然后像这样打电话:
var s = (from p in operatorList.DistinctBy(x => x.ID)
select p.ID, p.Name, p.Phone)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18968 次 |
最近记录: |