使用Distinct、GroupBy和Take求解Linq表达式

使用Distinct、GroupBy和Take求解Linq表达式,linq,lambda,Linq,Lambda,我正在使用实体框架,使用lambda表达式,我必须从网格(_numRecords)中选择所选记录的数量,其中包括排序、基于列(与列不同)删除重复项。代码如下: private IEnumerable<ReadViewModel> generateLocalData(IQueryable<ReadViewModel> query, [DataSourceRequest] DataSourceRequest dsRequest, int exportXml) { if

我正在使用实体框架,使用lambda表达式,我必须从网格(_numRecords)中选择所选记录的数量,其中包括排序、基于列(与列不同)删除重复项。代码如下:

private IEnumerable<ReadViewModel> generateLocalData(IQueryable<ReadViewModel> query, [DataSourceRequest] DataSourceRequest dsRequest, int exportXml)
{
    if (exportXml > 0)
        query = query.GroupBy(x => x.Id).Select(x => x.FirstOrDefault());
    //query = query.OrderByDescending(x => x.EventDate).GroupBy(x => x.Id).Select(x => x.FirstOrDefault());
    //query = query.DistinctBy(x => x.Id).AsQueryable<ReadViewModel>();

    query = query.OrderByDescending(x => x.EventDate);
    query = query.ApplySorting(dsRequest.Groups, dsRequest.Sorts);
    query = query.Take(this._numRecords);

    List<ReadViewModel> data;
    data = query.ToList();

    return data;
}

public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> knownKeys = new HashSet<TKey>();
    foreach (TSource element in source)
    {
        if (knownKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}
private IEnumerable generateLocalData(IQueryable查询,[DataSourceRequest]DataSourceRequest dsRequest,int-exportXml)
{
如果(exportXml>0)
query=query.GroupBy(x=>x.Id);
//query=query.OrderByDescending(x=>x.EventDate).GroupBy(x=>x.Id).Select(x=>x.FirstOrDefault());
//query=query.DistinctBy(x=>x.Id).AsQueryable();
query=query.OrderByDescending(x=>x.EventDate);
query=query.ApplySorting(dsRequest.Groups、dsRequest.Sorts);
query=query.Take(this.\u numRecords);
列出数据;
data=query.ToList();
返回数据;
}
公共静态IEnumerable DistinctBy(此IEnumerable源,Func键选择器)
{
HashSet knownKeys=新HashSet();
foreach(源中的TSource元素)
{
if(knownKeys.Add(键选择器(元素)))
{
收益-收益要素;
}
}
}
网格上有数据(可以有重复的Id字段),但当我将其导出为xml时,它应该是唯一的

问题是,当Distinct应用于lambda表达式时,它会破坏排序,我使用的是Take()方法,所以我需要在从DB获取数据之前使用它

我使用了两种方法来实现区分:按GroupBy&Single/Select和按扩展方法区分。但是,由于排序被破坏,我无法使用这些方法使其正常工作。

私有静态IQueryable DistinctBy(此IQueryable源、表达式keySelector)
private static IQueryable<T> DistinctBy<T, TKey>(this IQueryable<T> source, Expression<Func<T, TKey>> keySelector)
{
   return source.GroupBy(keySelector).Select(grp => grp.First());
}
{ 返回source.GroupBy(keySelector).Select(grp=>grp.First()); }
按要区分的键分组,然后从每个组中提取第一项。您可能需要在查询中使用一些不能很好地使用
First()
的提供程序来使用
FirstOrDefault()


当与linq to对象一起使用时,这是次优的,但是在您的问题中已经有了这种情况的最佳方法。

表达式将如何进行?我们使用的是expression在可枚举版本中用作Func的lambda应该可以工作
x=>x.Id