Entity Framework / Linq to SQL: Überspringen & Nehmen

Nur neugierig, wie Skip & Take funktionieren soll. Ich erhalte die Ergebnisse, die ich auf der Client-Seite sehen möchte, aber wenn ich den AnjLab SQL Profiler anschließe und das ausgeführte SQL betrachte, sieht es so aus, als würde er nach dem gesamten Satz von Zeilen suchen und diese an das zurückgeben Klient

Gibt es wirklich alle Zeilen zurück, um dann mit LINQ auf der Clientseite Inhalte zu sortieren und einzugrenzen?

Ich habe versucht, dies mit Entity Framework und Linq to SQL zu tun. beide scheinen dasselbe Verhalten zu haben.

Nicht sicher, dass es einen Unterschied macht, aber ich verwende C # in VWD 2010.

Irgendwelche Einsichten?

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();
}

Resulting SQL (Hinweis: Ich schließe die Count-Abfrage aus):

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]

ach einigen weiteren Nachforschungen stellte ich fest, dass das Folgende so funktioniert, wie ich es erwarten würd

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);           
}

Resulting 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

Ich mag die Art und Weise, wie die erste Option funktioniert. Übergabe eines Lambda-Ausdrucks als Sortierung. Gibt es eine Möglichkeit, dasselbe in der LINQ to SQL-Reihenfolge anhand der Syntax zu erreichen? Ich habe versucht, qry.OrderBy (sort) .Skip (skipRows) .Take (pageSize) zu verwenden, aber das ergab die gleichen Ergebnisse wie mein erster Codeblock. Führt mich zu der Annahme, dass meine Probleme in irgendeiner Weise mit OrderBy zusammenhängen.

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

PROBLEM GELÖS

Mußte die eingehende Lambda-Funktion in Ausdruck einschließen:

Expression<Func<Store,string>> sort

Antworten auf die Frage(10)

Ihre Antwort auf die Frage