C# 使用LINQ分页和存储过程分页的关键点是什么?

C# 使用LINQ分页和存储过程分页的关键点是什么?,c#,sql-server,linq,stored-procedures,pagination,C#,Sql Server,Linq,Stored Procedures,Pagination,我对LINQ分页和存储过程分页有一个问题: 如果我使用LINQ分页,那么使用Microsoft的逻辑是什么?意味着它将所有数据加载到列表中,然后执行分页逻辑 例如,如果我在SQL Server数据库中有100万条记录,并且我想使用LINQ分页,那么它将如何工作 代码段: _list = _list.Skip(StartIndex).Take(FetchRecords).ToList(); 如果LINQ首先加载所有记录,那么我是否必须进行存储过程分页 你需要记住这一点 ToList(IEnum

我对LINQ分页和存储过程分页有一个问题:

  • 如果我使用LINQ分页,那么使用Microsoft的逻辑是什么?意味着它将所有数据加载到列表中,然后执行分页逻辑

    例如,如果我在SQL Server数据库中有100万条记录,并且我想使用LINQ分页,那么它将如何工作

    代码段:

    _list = _list.Skip(StartIndex).Take(FetchRecords).ToList();
    
  • 如果LINQ首先加载所有记录,那么我是否必须进行存储过程分页


  • 你需要记住这一点

    ToList(IEnumerable)方法强制立即执行查询求值,并返回包含查询结果的列表

    ie没有ToList方法调用,查询不会执行,因此没有数据

    其次,您还应该使用OrderBy方法,例如
    OrderBy(o=>o.ID)您应该明确知道跳过和获取订单项的顺序


    进一步考虑使用“何处”和“选择”方法来限制数据有效载荷。

    这取决于您如何巧妙地使用LINQ…如果在使用
    .Skip()
    .Take()
    之前对查询执行
    .ToList()。但那只是因为你这么说的。如果您使用
    IQueryable
    操作并应用Skip/Take,则EF将使用SQL server提供的任何基于服务器的分页机制,并且只返回您使用
    .Take(n)
    操作符请求的行