linq

2015-12-15 35 views
0

如何跳过并采取工作我有以下Linq查询。它的作品很好,但似乎令人困惑的事情是和take()函数如何在linq中工作。 这里是我的查询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()

+0

它根据您的where查询从数据库中获取记录并将其保存为可查询,然后应用跳过并转到特定数据 –

+0

除了规范之外,将发生什么取决于您正在使用的查询提供程序的具体情况正在执行的查询。记录生成的查询以查明实际发生的情况。 – Servy

回答

5

当你打电话。取而已,它只是转换为SQL:TOP N语法

当你打电话.Skip和。取在一起时,会产生至少2个查询,通过使用ROWNUMBER过滤掉。

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

如果您好奇,可以随时使用SQL事件探查器,或者只是在调试模式下检查生成的SQL。

下面是一个简单的MSDN文章解释了它 https://msdn.microsoft.com/library/bb386988(v=vs.100).aspx

2

限制如果你问的LINQ to SQL,可以运行的SQL事件探查器得到的查询,通过LINQ提供程序生成。 但我可以告诉你,LINQ将限制skiptake只能得到记录,使用row_number运营商在SQL:

的查询会是这样(跳过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不同,具体取决于您使用的集合。

+0

你确定这个工作,我用linq跳过,只采取可疑的数据作品? –

+0

@ArijitMukherjee linq2sql与mssql的工作原理是这样的,linq2object工作不同 – Backs

1

所有的LINQ的IEnumerable扩展的源代码可以在这里找到: System.Linq.Enumerable

在这里,您可以看到如何跳过,并采取工作