Verwendung von Skip
y Take
ist definitiv der richtige Weg. Wenn ich dies implementieren würde, würde ich wahrscheinlich meine eigene Erweiterungsmethode für das Paging schreiben (um den Code lesbarer zu machen). Die Implementierung kann natürlich Skip
y Take
:
static class PagingUtils {
public static IEnumerable<T> Page<T>(this IEnumerable<T> en, int pageSize, int page) {
return en.Skip(page * pageSize).Take(pageSize);
}
public static IQueryable<T> Page<T>(this IQueryable<T> en, int pageSize, int page) {
return en.Skip(page * pageSize).Take(pageSize);
}
}
Die Klasse definiert zwei Erweiterungsmethoden - eine für IEnumerable
und eine für IQueryable
was bedeutet, dass Sie es sowohl mit LINQ to Objects als auch mit LINQ to SQL verwenden können (beim Schreiben von Datenbankabfragen wählt der Compiler die IQueryable
Version).
Je nach Ihren Anforderungen an die Auslagerungsfunktion können Sie auch zusätzliches Verhalten hinzufügen (z. B. zur Behandlung negativer pageSize
o page
Wert). Hier ist ein Beispiel, wie Sie diese Erweiterungsmethode in Ihrer Abfrage verwenden würden:
var q = (from p in products
where p.Show == true
select new { p.Name }).Page(10, pageIndex);