到目前为止,所有答案都是在两个查询中完成的。我认为这很糟糕,并且由于 SQL 优化的奇迹,您可以做一些小技巧来避免需要对分页计数进行第二次查询。
不要对计数进行第二次查询,而是将计数附加到每一行,然后在结果集中将其分开。
下面是我写的一个小帮手来帮助做到这一点:
public static IQueryable<EntityWithCount<T>> GetWithTotal<T>(this IQueryable<T> entities, int page, int pageSize) where T : class
{
return entities
.Select(e => new EntityWithCount<T> { Entity = e, Count = entities.Count() })
.Skip((page-1) * pageSize)
.Take(pageSize);
}
public class EntityWithCount<T> where T : class
{
public T Entity { get; set; }
public int Count { get; set; }
}
github上的完整源代码
对于合理的页面大小,此方法更快,并且避免了您在执行多个查询时可能遇到的任何事务问题。
您可以在任何其他未枚举查询的末尾链接它(例如问题中的那个,替换跳过/接受和 .ToListAsync()
通话之前)