1

如何获取与以下函数中的谓词匹配的记录数?需要生成分页。

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());
}
4

3 回答 3

3

要计算项目的数量,需要在分页之前使用 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

于 2018-05-21T12:51:06.803 回答
1

您应该在 ToList() 调用之前单独查询并使用单独的 Count() 调用。相关部分:

var query = dbContext.Set<T>().Where(predicate);
var cnt = query.Count();
var result = query.Skip(pageSize * (pageNo - 1)).Take(pageSize).ToList();
于 2018-05-21T11:56:48.877 回答
0

到目前为止,所有答案都是在两个查询中完成的。我认为这很糟糕,并且由于 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()通话之前)

于 2018-05-21T13:12:50.240 回答