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;
}
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
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. –
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