Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# skip和take在linq中是如何工作的_C#_Linq - Fatal编程技术网

C# skip和take在linq中是如何工作的

C# skip和take在linq中是如何工作的,c#,linq,C#,Linq,我有以下Linq查询。它工作得很好,但令人困惑的是skip()和take()函数如何在linq中工作。 这是我的问题 (from GRD in _tblAcademicYears.GetQueryable() where GRD.SchoolID == intSchoolID select new AcademicYearsModel { Academ

我有以下Linq查询。它工作得很好,但令人困惑的是
skip()
take()
函数如何在linq中工作。 这是我的问题

(from GRD in _tblAcademicYears.GetQueryable()
             where GRD.SchoolID == intSchoolID                 
             select new AcademicYearsModel
             {
                 AcademicYearID = GRD.AcademicYearID,
                 SchoolID = GRD.SchoolID,
                 AcademicYearName = GRD.AcademicYearName,
                 AcademicYearStart = GRD.AcademicYearStart,
                 AcademicYearEnd = GRD.AcademicYearEnd,
                 AcademicYearRemarks = GRD.AcademicYearRemarks,
                 IsActive = GRD.IsActive,
                 CreatedOn = GRD.CreatedOn,
                 CreatedBy = GRD.CreatedBy,
                 ModifiedOn = GRD.ModifiedOn,
                 ModifiedBy = GRD.ModifiedBy
             }
    ).Where(z => z.AcademicYearName.Contains(param.sSearch) || z.AcademicYearStart.ToString().Contains(param.sSearch)
    || z.AcademicYearEnd.ToString().Contains(param.sSearch) || z.AcademicYearRemarks.Contains(param.sSearch))
  .Skip(param.iDisplayStart).Take(param.iDisplayLength).ToList();
此查询将如何从数据库中获取记录。 它将从数据库中获取所有记录,然后应用
skip()
take()

或者它只会得到限制在
skip()
take()

范围内的记录。如果您询问有关LINQ to SQL的信息,您可以运行SQL探查器来获取由LINQ提供程序生成的查询。 但我可以告诉您,LINQ将使用SQL中的运算符仅获取limits
skip
take
中的记录:

查询将如下所示(跳过3并取3):


在LINQ to Entities中,它的工作原理不同,具体取决于您使用的集合。

当您调用.Take only时,它将转换为SQL:TOP N语法

当您调用.Skip和.Take时,它将使用ROWNUMBER筛选出至少两个查询

所以,您的问题的简短答案是:不,它不会从数据库中获取所有记录。它将运行SQL进行筛选和选择

如果您感到好奇,您可以始终使用SQL profiler,或者只在调试模式下检查生成的SQL

下面是一篇简单的MSDN文章对此进行了解释

所有Linq IEnumerable扩展的源代码都可以在这里找到:


在这里,您可以看到skip and take work

如何根据where查询从数据库中获取记录,并将其保持为可查询状态,然后将skip and take应用于特定数据除了执行特定查询外,所发生的情况还取决于您使用的查询提供程序的具体情况。记录生成的查询以了解实际发生的情况。你确定这样做有效吗?我过去认为linq skip and take只对可查询的数据有效吗?@ArijitMukherjee linq2sql与mssql的工作方式类似,linq2object的工作方式不同
SELECT TOP (3) 
[Extent1].[ID] AS [ID], 
[Extent1].[Name] AS [Name], 
FROM ( 
    SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[Name] AS [Name], 
    row_number() OVER (ORDER BY [Extent1].[Name] ASC) AS [row_number]
    FROM [dbo].[tec_Stores] AS [Extent1]
)  AS [Extent1]
WHERE [Extent1].[row_number] > 3
ORDER BY [Extent1].[Name] ASC