C# skip和take在linq中是如何工作的
我有以下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
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中的运算符仅获取limitsskip
和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