[英]How does skip and take works in linq
我有以下Linq查詢。 它運作良好,但似乎令人困惑的是linq中skip()
和take()
函數的工作方式。 這是我的查詢
(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()
限制內的記錄
當您調用.Take僅時,它將僅轉換為SQL:TOP N語法
當您同時調用.Skip和.Take時,它將使用ROWNUMBER進行過濾,從而至少生成2個查詢。
因此,您的問題的簡短答案是:不,它不會從數據庫中獲取所有記錄。 它將運行SQL進行過濾和選擇。
如果您感到好奇,可以隨時使用SQL事件探查器,或僅在調試模式下檢查生成的SQL。
這是一條簡單的MSDN文章對其進行解釋https://msdn.microsoft.com/library/bb386988(v=vs.100).aspx
如果詢問有關LINQ to SQL的信息,則可以運行sql-profiler來獲取由linq提供程序生成的查詢。 但是我可以告訴您,LINQ將僅使用SQL中的row_number運算符來獲取限制skip
and take
記錄:
查詢將如下所示(跳過3並取3):
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
在LINQ to Entities中,它的工作方式有所不同,具體取決於您使用的集合。
所有Linq IEnumerable擴展的源代碼都可以在這里找到: System.Linq.Enumerable
在這里,您可以了解跳過和接受工作的方式
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.