C#实体框架分页(C# Entity Framework Pagination)

2019-06-23 15:18发布

有没有办法让一个复杂的Linq查询和百万条记录的行数没有击中分贝两次或写2次独立的查询?

我可能有我自己的建议。 写一个存储过程,但我好与MySQL不MSSQL。

什么更好的建议将是巨大的。 此外,如果任何人都知道,如果微软正在加入这项功能的实体框架。

Answer 1:

我建议使用取()函数。 这可用于指定的记录数从LINQ查询或列表服用。 例如

List<customers> _customers = (from a in db.customers select a).ToList();
var _dataToWebPage = _customers.Take(50);

我使用了类似的技术在MVC应用程序,我写_customers列表到会话,然后当用户点击页面2,3等,这节省了多个数据库访问上使用这个列表进行进一步分页查询。 但是,如果你的列表是非常大的,然后写它太会话可能不是一个好主意。

对于分页可以使用Skip()和Take()函数在一起。 例如,要获取数据的第2页:

var _dataToWebPage = _customers.Skip(50).Take(50);


Answer 2:

显示数百万条记录的常用方法是根本不显示所有页面。 想想看:如果你有百万条记录,说每页20个甚至100个项目,那么你就必须页数万人。 它没有任何意义,以显示他们。 你可以简单地加载当前页面,并提供一个链接到下一个页面,就是这样。 或者,你可以加载说100-500记录,但仍然只显示一个页面,并使用加载的记录信息,以生成第一几页网页链接(所以肯定知道下一个页面有多少可用)。



Answer 3:

它是SQL Server的那么容易。 你可以这样写查询:

select count() over(), table.* from table

计数()超过()将返回结果共行的数量,所以你并不需要运行两个查询..请记住,你应该在你的环境中运行原始的SQL或用短小精悍该返回结果作为视图模型



Answer 4:

我最近被(从复制)该代码项目文章启发实体框架分页

代码:

public async Task<IList<SavedSearch>> FindAllSavedSearches(int page, int limit)
{
    if (page == 0)
        page = 1;

    if (limit == 0)
        limit = int.MaxValue;

    var skip = (page - 1) * limit;

    var savedSearches = _databaseContext.SavedSearches.Skip(skip).Take(limit).Include(x => x.Parameters);
    return await savedSearches.ToArrayAsync();
}

我不会和实体框架经历和我没有测试它的性能,所以请谨慎使用:)



文章来源: C# Entity Framework Pagination