如何在linq中跳过并采取工作

时间:2015-12-15 05:30:09

标签: c# linq

我有以下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()

的记录

3 个答案:

答案 0 :(得分:5)

当你打电话时。只接受,它只会翻译成SQL:TOP N语法

当您调用.Skip和。一起使用时,它将生成至少2个查询,方法是使用ROWNUMBER过滤掉。

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

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

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

答案 1 :(得分:2)

如果您询问LINQ to SQL,可以运行sql-profiler来获取由linq提供程序生成的查询。 但我可以告诉你,在SQL中使用row_number运算符,LINQ只会获得限制skiptake的记录:

查询将如下(跳过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中,它的工作方式不同,具体取决于您使用的集合。

答案 2 :(得分:1)

可以在此处找到所有Linq IEnumerable扩展的源代码: System.Linq.Enumerable

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