如何使用Entity Framework获取记录计数匹配谓词

时间:2018-05-21 11:44:45

标签: c# linq entity-framework-6

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

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

3 个答案:

答案 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; }
}

Full source on github

对于合理的页面大小,此方法更快,并避免了您可能进行多次查询的任何事务性问题。

您可以在任何其他未枚举的查询(例如问题中的那个,替换skip / take以及.ToListAsync()调用之前)链接此链接