簡體   English   中英

如何在Linq中跳過和采用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM