Ich suchte einige LINQ zu SQL-Code, der für eine ausgelagerte Tabelle verwendet wird. Darin müssen eine Untergruppe von Datensätzen und die Gesamtzahl der Datensätze in der Datenbank zurückgegeben werden. Der Code sieht wie folgt aus:Linq to sql - Optimale Möglichkeit, Sub-Satz von Datensätzen und die Gesamtanzahl der Datensätze
var query = (from p in MyTable select new {p.HostCable, p.PatchingSet});
int total = query.ToList().Count;
query = query.Skip(5).Take(10);
ich ein wenig graben wollte, was passiert, wenn diese ausgeführt wird, sehe ich, dass 2-Abfragen passieren - eine alle Zeilen aus der db zu bekommen, und man die Teilmenge zu erhalten. Unnötig zu sagen, dass die Auswirkungen auf die Leistung, alle Datensätze zu erhalten, nicht gut sind. Ich vermute, dass die "ToList" die Ausführung der Abfrage erzwingt, dann wird die Count-Methode für die gesamte Liste ausgeführt.
In die Erklärung Refactoring effizienter zu sein - das ist meine verbesserte Version:
int total = MyTable.Count();
var query = (from p in MyTable select new {p.HostCable, p.PatchingSet}).Skip(5).Take(10);
Dies führt zu einem SQL-Hit für ein „Select K ..“ und dann eine SQL für die eigentlichen Hit Auswahl von Datensätzen.
Ist das optimal, gibt es bessere Lösungen?
Danke!
Ich stimme zu. Dies wäre der beste Weg. Eine count (*) -Operation ist normalerweise ziemlich schnell (mit den richtigen Indizes). – Steven