2009-04-08 13 views
0

Ich habe eine Abfrage, die etwa 10 Joins enthält. Wenn Sie eine Listenansicht und eine Linq-Datenquelle verwenden, werden die Seiten mit SQL2008 angezeigt. Bei der Ausführung mit SQL2000 wird jedoch kein korrektes Ergebnis erzielt. Es wird keine Ausnahme ausgelöst, aber die Ergebnisse sind eindeutig nicht in Ordnung, und manchmal wird dieselbe Seite zurückgegeben. Beim Lesen der LINQ-Dokumente wird das Paging für Abfragen mit Joins in SQL2000 nicht unterstützt. Genug gesagt, obwohl ich eine Ausnahme erwartet hätte.IQueryable gegen SQL 2000 Paging mit Joins

Ich kann die Daten jetzt nicht aus SQL2000 verschieben. Die Lösung besteht darin, eine vollständige Abfrage durchzuführen und dann ein speicherbasiertes Paging durchzuführen.

Jetzt ist die Frage: Ist es effizienter, ToList() oder ToArray() aufzurufen?

AsEnumerable() behebt das Problem nicht. Betrachtet man die Erweiterungsmethode mit Reflector, gibt es einfach die 'Quelle' zurück, so dass dies für mich sinnvoll ist.

e.Result = query.AsEnumerable(); 
public static IEnumerable<TSource> AsEnumerable<TSource>(
    this IEnumerable<TSource> source) 
{ 
    return source; 
} 

Jedoch würde die folgende effizienter sein als entweder ToList() oder ToArray()? Es funktioniert und es verzögert die Ausführung.

e.Result = query.ToEnumerable(); 

public static IEnumerable<TSource> ToEnumerable<TSource>(
    this IEnumerable<TSource> source) 
{ 
    foreach (var item in source) 
     yield return item; 
} 

Antwort

3

ToList() wird effizienter als ToArray(), weil es nicht die letzte Kopie von einem übergroßen Puffer zu einem festen Größe Array zu tun braucht.

Wenn Sie In-Memory-Paging durchführen möchten, müssen Sie nicht verzögerte Ausführung (IMO), weil Sie die Anzahl der Elemente und zufälliger Zugriff abrufen müssen. Sie möchten die Abfrage nicht jedes Mal erneut ausführen müssen.

+0

Danke. Ich muss jedes Mal erneut abfragen, da dies eine Web-App ist und ich möchte das Ergebnis nicht wirklich in einem temporären Speicherort wie Session speichern. Immer noch auf dem Zaun mit verzögerter Ausführung? Mybe Haare spalten? Am Ende sollte ich in der Lage sein, von Sql 2k wegzukommen, aber jetzt nicht. – andleer

+0

Wie werden Sie herausfinden, wie viele Seiten Sie anzeigen möchten? Die Tatsache, dass die Ergebnisse nicht in Ordnung sind, deutet darauf hin, dass Sie Probleme haben werden, egal was Sie tun - es sei denn, Sie können die Sortierreihenfolge konsistent halten, Sie können unmöglich vernünftig paginieren, wenn ich etwas verpasse. –

+0

Paging und Sortierung funktioniert einwandfrei, wenn ich eine Liste zurückgebe. Es schlägt fehl, wenn ich ein IQueryable zurückgebe. Mit IQ wird die erste Seite korrekt angezeigt, aber Dinge fallen dann von dort ab. Wenn man sich den SQL-Profiler anschaut, ist das SQL wirklich eklig. Sub-Abfrage über Sub-Abfrage über Sub-Abfrage über Joins usw. – andleer