Entity Framework / Linq to SQL: Saltar y tomar

Solo tengo curiosidad por saber cómo se supone que funciona Skip & Take. Estoy obteniendo los resultados que quiero ver en el lado del cliente, pero cuando conecto el Analizador SQL AnjLab y miro el SQL que se está ejecutando, parece que está buscando y devolviendo todo el conjunto de filas a cliente.

¿Realmente devuelve todas las filas y luego ordena y reduce las cosas con LINQ en el lado del cliente?

He intentado hacerlo con Entity Framework y Linq to SQL; ambos parecen tener el mismo comportamiento.

No estoy seguro de que haga alguna diferencia, pero estoy usando C # en VWD 2010.

Alguna idea?

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: estoy excluyendo la 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]

Después de algunas investigaciones adicionales, descubrí que lo siguiente funciona de la manera que esperaría:

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

Realmente me gusta la forma en que funciona la primera opción; Pasando en una expresión lambda para sort. ¿Hay alguna manera de lograr lo mismo en la sintaxis ordenada por LINQ to SQL? Intenté usar qry.OrderBy (sort) .Skip (skipRows) .Take (pageSize), pero eso me dio los mismos resultados que mi primer bloque de código. Me lleva a creer que mis problemas están de alguna manera vinculados a OrderBy.

====================================

PROBLEMA RESUELTO

Tuve que ajustar la función lambda entrante en Expression:

Expression<Func<Store,string>> sort

Respuestas a la pregunta(5)

Su respuesta a la pregunta