如何在下面的函数中获取与谓词匹配的记录数?需要生成分页。
public async virtual Task<IEnumerable<T>> GetAll(Expression<Func<T, bool>> predicate, int pageNo, int pageSize)
{
return (await dbContext.Set<T>().Where(predicate).Skip(pageSize * (pageNo - 1)).Take(pageSize).ToListAsync());
}
答案 0 :(得分:2)
使用Count()方法计算分页前需要完成的项目数。 以下是Microsoft文档中的示例:
public static async Task<PaginatedList<T>> CreateAsync(IQueryable<T> source, int pageIndex, int pageSize)
{
var count = await source.CountAsync();
var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
return new PaginatedList<T>(items, count, pageIndex, pageSize);
}
有关详细信息,请查看以下链接: https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/sort-filter-page?view=aspnetcore-2.0
答案 1 :(得分:1)
您应该在ToList()调用之前单独查询并使用单独的Count()调用。 相关部分:
vim -u /path/to/my/vimrc
答案 2 :(得分:0)
到目前为止,所有答案都是在两个查询中完成的。我认为这很糟糕,并且由于SQL优化的奇迹,你可以做一些小问题,以避免需要对分页中的计数进行第二次查询。
不是对count进行第二次查询,而是将计数附加到每一行,然后在结果集中将其分开。
下面是我写的一个小帮手,以帮助做到这一点:
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; }
}
对于合理的页面大小,此方法更快,并避免了您可能进行多次查询的任何事务性问题。
您可以在任何其他未枚举的查询(例如问题中的那个,替换skip / take以及.ToListAsync()
调用之前)链接此链接