c# - 如何使用 Entity Framework 在动态构建的查询中按实体键获取行索引

标签 c# .net sql-server entity-framework linq-to-entities

在网格中,我需要通过记录的 ID 来分页。这就是为什么我需要在用户过滤和用户排序的集合中找到它的索引。

我正在使用 LINQ to Entities .查询是根据用户输入动态构建的。

该表包含太多(超过 10^5)条记录,对于以下 Stack Overflow suggestion做个好人:

Recs = Recs.Where( /* Filters */ );
Recs = Recs.OrderBy( /* Sort criteria */ );
Recs.AsEnumerable()
        .Select((x,index) => new {RowNumber = index, Record = x})
        .Where(x=>x.Record.ID = 35);

因为 LINQ to Entities 不支持 Select((entity, index) => ...),所以需要从 SQL 服务器下载 250,000 条记录,这样我才能决定显示页面25,000。

目前,我最有前途的想法是将每个排序标准转化为一个过滤器。因此,找到按高度升序排序的人的索引将变成计算较矮的人(排序标准“高度升序”=>过滤“高度小于”+计数)。

我应该如何处理这个问题?这个问题已经解决了吗?有.NET的图书馆吗?这甚至让我走了一半?

最佳答案

这是一个递归函数,您可以调用它来计算行号。如果您的数据库记录经常更改,它可能无法正常工作,因为这是多次调用数据库,每次都会将搜索范围缩小一半。

public static int FindRowNumber<T>(IQueryable<T> query, Expression<Func<T, bool>> search, int skip, int take)
{
  if(take < 1) return -1;
  if(take == 1) return query.Skip(skip).Take(take).Any(search) ? skip : -1;      


  int bottomSkip = skip;
  int bottomTake = take / 2;
  int topSkip = bottomTake + bottomSkip;
  int topTake = take - bottomTake;

  if(query.Skip(bottomSkip).Take(bottomTake).Any(search))
  {        
    return FindRowNumber(query, search, bottomSkip, bottomTake);
  }
  if(query.Skip(topSkip).Take(topTake).Any(search))
  {
    return FindRowNumber(query, search, topSkip, topTake);
  }

  return -1;
}

你这样调用它:

var query = ... //your query with ordering and filtering
int rownumber = FindRowNumber(query, x => x.Record.ID == 35, 0, query.Count());

关于c# - 如何使用 Entity Framework 在动态构建的查询中按实体键获取行索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9824585/

相关文章:

c# - 当特定属性小于两个列表的其他属性时,为 ALL 返回 TRUE

c# - 尝试使用 C# 写入关键字窗口元数据项

c# - 为什么 PropertyInfo.SetValue 不是通用方法?

.net - Websharper执行异步调用将返回服务器错误500

C# 错误 - 找不到命名空间 ManagementClass、ManagementObject 和 ManagementObjectCollection

.net - 如何让 Web API OData v4 使用 DateTime

sql-server - 更新后检索列的值?

c# - 如何使用 C# 以科学格式解析 double

sql - 使用 JOIN 和 RANK() 进行查询的性能问题

sql - 如何使用INSERT INTO + SELECT FROM插入自定义值?