2015-12-15 2 views
0

У меня есть следующий запрос 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()

+0

Это берете записи из базы данных в соответствии с вашим запросом и сохраняйте его как запрошенным, а затем применяйте пропуски и переходите к конкретным данным. –

+0

. Что произойдет, будет зависеть от специфики используемого вами поставщика запросов, в дополнение к спецификации выполняемый. Зарегистрируйте сгенерированный запрос, чтобы узнать, что на самом деле происходит. – Servy

ответ

5

При вызове .Снять только, он будет просто перевести SQL: TOP N синтаксисом

При вызове Пропустите и .Снять вместе, он будет генерировать по крайней мере, 2 запросов, с помощью ROWNUMBER, чтобы отфильтровать.

Итак, короткий ответ на ваш вопрос: Нет, он не получит все записи из базы данных. он будет запускать SQL для фильтрации и выбора.

Если вам интересно, вы всегда можете использовать профилировщик SQL или просто проверить сгенерированный SQL в режиме отладки.

Вот простой статье MSDN объясняет https://msdn.microsoft.com/library/bb386988(v=vs.100).aspx

2

Если вы спрашиваете о LINQ к SQL, вы можете запустить SQL-Profiler для получения запроса генерируется поставщиком Linq. Но я могу вам сказать, LINQ получат только те записи, в пределах skip и take, используя 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

Здесь вы можете увидеть, как пропустить и брать работу

Смежные вопросы