如何使用 Take 和 Skip 方法从数据库表中获取所有条目?

Posted

技术标签:

【中文标题】如何使用 Take 和 Skip 方法从数据库表中获取所有条目?【英文标题】:How to get all entries from the database table using Take and Skip methods? 【发布时间】:2021-09-11 23:21:42 【问题描述】:

在我们当前的应用程序中,我们在数据层中有以下功能:

public IEnumerable<User> GetUsers(IPagedAndFilteredAndSortedRequest request)

    var users = dbContext.Users;
    //1) "filteredAndSorted" is a result of applying filters and sorts on users
    //2) "filteredAndSorted" is OrderedQueriable
    //3) "rows" is number of rows to skip based on request.PageSize and request.PageNumber
    var result = filteredAndSorted.Skip(rows).Take(request.PageSize);
    return result.ToArray();

我们需要使用这个方法从数据库中获取所有用户。所以,问题是:

    将 1 作为 pageNumber 并将 Int32.MaxValue 作为 pageSize 传递是个好主意吗? MSSQL 数据库表的最大行数是多少?

【问题讨论】:

'MSSQL 数据库表的最大行数是多少?'只需谷歌它,我的伙计/伙计!请参阅:docs.microsoft.com/en-us/sql/sql-server/… 答案:'受限于可用存储' 如果你想在一个请求中获取所有记录,请不要使用.Skip.Take 摆脱那个讨厌的ToArray() 电话。这是对内存和cpu时间的巨大浪费。此外,如果您在此方法中对数据进行预排序,则您希望返回 IOrderedEnumerable 除了是否(以及为什么)您应该希望通过 EF 查询获取所有行之外,是的,如果给定了 GetUsers 方法,则选项 1 实际上是唯一的选择。 【参考方案1】:

将 1 作为 pageNumber 并将 Int32.MaxValue 作为 pageSize 传递是个好主意吗?

不是真的。最好向request 添加另一个属性,例如

var result = filteredAndSorted;
if (request.UsePaging)

  result = filteredAndSorted.Skip(rows).Take(request.PageSize);


return result.ToArray();

或者使用request.PageSize

【讨论】:

以上是关于如何使用 Take 和 Skip 方法从数据库表中获取所有条目?的主要内容,如果未能解决你的问题,请参考以下文章

Linq:使用Take和Skip实现分页

LinQ中Skip()方法和Take()方法的使用

Skip and Take 不使用 MySQL EntityFrameworkCore

具有实体框架并使用 orderby 和 skip/take 的规范模式

NHibernte 4.0.3版本中,使用Queryover().Where().OrderBy().Skip().Take()方法分页获取数据失败

使用 Linq Skip Take 进行传统 SQL 查询,而不是使用 RowNum