Entity Framework / Linq to SQL: ignorar
Apenas curioso para saber como o Skip & Take deve funcionar. Estou obtendo os resultados que desejo ver no lado do cliente, mas quando conecto o AnjLab SQL Profiler e observo o SQL que está sendo executado, parece que ele está consultando e retornando todo o conjunto de linhas para o cliente.
Realmente está retornando todas as linhas e depois classificando e restringindo as coisas com o LINQ no lado do cliente?
Eu tentei fazê-lo com o Entity Framework e o Linq to SQL; ambos parecem ter o mesmo comportamento.
Não tenho certeza de que faça alguma diferença, mas estou usando C # no VWD 2010.
Alguma visão?
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 resultante (Nota: estou excluindo a consulta 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]
Após algumas pesquisas, descobri que o seguinte funciona da maneira que eu esperava:
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 resultante:
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
Eu realmente gosto da maneira como a primeira opção funciona; Passando uma expressão lambda para classificação. Existe alguma maneira de realizar a mesma coisa na sintaxe de ordem LINQ to SQL? Eu tentei usar qry.OrderBy (sort) .Skip (skipRows) .Take (pageSize), mas isso acabou me dando os mesmos resultados que o meu primeiro bloco de código. Isso me leva a acreditar que meus problemas estão de alguma forma ligados ao OrderBy.
====================================
PROBLEMA RESOLVIDOTeve que quebrar a função lambda recebida na Expressão:
Expression<Func<Store,string>> sort