C# 在分页之前计算记录的总大小,并在分页之后返回它们,而不必两次访问数据库

C# 在分页之前计算记录的总大小,并在分页之后返回它们,而不必两次访问数据库,c#,entity-framework,asp.net-core,C#,Entity Framework,Asp.net Core,我有一种分页方法,它获取页面并限制它们,然后将它们应用于给定的集合(可能会应用预筛选/查询),然后将分页应用于该集合,因此从计算记录到应用分页,服务器端无需做任何事(只计算最终结果,最终结果存储在内存中) 公共异步任务应用(IQueryable集) { var httpQuery=_accessor.HttpContext.Request.Query; var pageValue=httpQuery.LastOrDefault(x=>x.Key==“page”).Value; 如果(pageVa

我有一种分页方法,它获取页面并限制它们,然后将它们应用于给定的集合(可能会应用预筛选/查询),然后将分页应用于该集合,因此从计算记录到应用分页,服务器端无需做任何事(只计算最终结果,最终结果存储在内存中)

公共异步任务应用(IQueryable集)
{
var httpQuery=_accessor.HttpContext.Request.Query;
var pageValue=httpQuery.LastOrDefault(x=>x.Key==“page”).Value;
如果(pageValue.Count>0)int.TryParse(pageValue,out\u page);
var limitValue=httpQuery.LastOrDefault(x=>x.Key==“limit”).Value;
如果(limitValue.Count>0)int.TryParse(limitValue,out\u limit);

如果(_limit>1000 | | | u limit不可能只点击数据库一次就同时获取对象数和对象数。如果要进行分页,两个查询都是必需的。

不,分页的整个前提是,在获取总记录的子集之前,需要知道完整的行数。唯一的方法是在1q内完成最重要的是加载所有记录。(这对于大数据集来说是一个更糟糕的选择!)


我看到的一个问题是,您正在使用
Take
来限制行数(0只是不要报告行总数。在UI中说“第1页,共页?”或诸如此类的内容。如果使用分页(不检索所有记录),则需要两个查询)因为您需要计数查询。您可以将计数缓存几分钟以提高性能,并提供对页面的估计,而不是实时的。@Devon您可以进一步解释我如何应用缓存方法吗?回答得很好,感谢您指出问题,我不知道我重新安排了顺序(跳过->接受),但在搜索过程中,用户确实不关心行数,但在这个特定的情况下,他确实关心,因为返回的数据的性质(在本例中进行检查),但我可以对{x}+行做同样的事情
var pagedData = set.Skip(page * pageSize).Take(pageSize).ToList();
int maxPageCount = (((page) / 10)+1) * 10;
int roughCountLimit = pageSize * maxPageCount + 1;

rowCount = set.Take(roughCountLimit).Count();
bool isRoughCount = rowCount == roughCountLimit;
var pagedData = set.Skip(page * pageSize).Take(pageSize).ToList();
page #1 (0) / 10 = 0.  (0+1)* 10 = 10.
page #2 (1) / 10 = 0.  (0+1)* 10 = 10.
page #10 (9) / 10 = 0. (0+1)* 10 = 10.
 page #11 (10) / 10 = 1. (1+1)* 10 = 20.