Просто любопытно, как Skip & Take должны работать.Я получаю результаты, которые хочу увидеть на стороне клиента, но когда я подключаю AnjLab SQL Profiler и смотрю на выполняемый SQL, он выглядит так, как будто он запрашивает и возвращает весь набор строк вclient.
Действительно ли он возвращает все строки, затем сортирует и сужает содержимое с помощью LINQ на стороне клиента?
Я пытался сделать это как с Entity Framework, так и с Linq to SQL;оба, кажется, имеют одинаковое поведение.
Не уверен, что это имеет какое-то значение, но я использую C # в VWD 2010.
Любое понимание?
public IEnumerable<Store> ListStores(Func<Store, string> sort, bool desc, int page, int pageSize, out int totalRecords)
{
var context = new TectonicEntities();
totalRecords = context.Stores.Count();
int skipRows = (page - 1) * pageSize;
if (desc)
return context.Stores.OrderByDescending(sort).Skip(skipRows).Take(pageSize).ToList();
return context.Stores.OrderBy(sort).Skip(skipRows).Take(pageSize).ToList();
}
РезультатSQL (Примечание: я исключаю запрос Count):
SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name],
[Extent1].[LegalName] AS [LegalName],
[Extent1].[YearEstablished] AS [YearEstablished],
[Extent1].[DiskPath] AS [DiskPath],
[Extent1].[URL] AS [URL],
[Extent1].[SecureURL] AS [SecureURL],
[Extent1].[UseSSL] AS [UseSSL]
FROM [dbo].[tec_Stores] AS [Extent1]
После некоторых дальнейших исследований я обнаружил, что следующее работает так, как я ожидал:
public IEnumerable<Store> ListStores(Func<Store, string> sort, bool desc, int page, int pageSize, out int totalRecords)
{
var context = new TectonicEntities();
totalRecords = context.Stores.Count();
int skipRows = (page - 1) * pageSize;
var qry = from s in context.Stores orderby s.Name ascending select s;
return qry.Skip(skipRows).Take(pageSize);
}
Результирующий SQL:
SELECT TOP (3)
[Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name],
[Extent1].[LegalName] AS [LegalName],
[Extent1].[YearEstablished] AS [YearEstablished],
[Extent1].[DiskPath] AS [DiskPath],
[Extent1].[URL] AS [URL],
[Extent1].[SecureURL] AS [SecureURL],
[Extent1].[UseSSL] AS [UseSSL]
FROM ( SELECT [Extent1].[ID] AS [ID], [Extent1].[Name] AS [Name], [Extent1].[LegalName] AS [LegalName], [Extent1].[YearEstablished] AS [YearEstablished], [Extent1].[DiskPath] AS [DiskPath], [Extent1].[URL] AS [URL], [Extent1].[SecureURL] AS [SecureURL], [Extent1].[UseSSL] AS [UseSSL], 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 SQL orderby?Я попытался использовать qry.OrderBy (sort) .Skip (skipRows) .Take (pageSize), но в итоге я получил те же результаты, что и мой первый блок кода.Приводит меня к мысли, что мои проблемы так или иначе связаны с OrderBy.
===================================
РЕШЕНИЕ ПРОБЛЕМЫ
Пришлось обернуть входящую лямбда-функцию в выражение:
Expression<Func<Store,string>> sort