Frage

Ich verwende aufzählbare.

return (from term in dataContext.Terms
        where term.Name.StartsWith(text)
        select term).ToDictionary(t => t.TermID, t => t.Name);

Wird dieser Anruf die Gesamtheit jeder Begriffe abrufen oder wird er nur den Termin und die Namensfelder von meinem Datenanbieter abrufen? Mit anderen Worten, würde ich mir den Datenbankverkehr speichern, wenn ich sie stattdessen so schrieb:

return (from term in dataContext.Terms
        where term.Name.StartsWith(text)
        select new { term.TermID, term.Name }).ToDictionary(t => t.TermID, t => t.Name);
War es hilfreich?

Lösung

Aufzählbar. Der erste Teil Ihrer Aussage "(aus ... SELECT -Begriff") ist ein iQueryable -Objekt. Abfragen wird den Ausdruck betrachten und die SQL -Anweisung erstellen. Es wandelt sich dann in ein Ienumerable um, um sie an eine zwingende () zu übergeben.

Mit anderen Worten, ja, Ihre zweite Version wäre effizienter.

Andere Tipps

Die generierte SQL gibt die gesamte Laufzeit zurück, sodass Ihre zweite Aussage genau das senkt, was Sie brauchen.

Sie können festlegen dataContext.Log = Console.Out und schauen Sie sich die verschiedenen Ergebnisse der Abfrage an.

Unter Verwendung meiner Beispiel -Linqpad -Datenbank finden Sie hier ein Beispiel:

var dc = (TypedDataContext)this;

// 1st approach
var query = Orders.Select(o => o);
dc.GetCommand(query).CommandText.Dump();
query.ToDictionary(o => o.OrderID, o => o.OrderDate).Dump();

// 2nd approach
var query2 = Orders.Select(o => new { o.OrderID, o.OrderDate});
dc.GetCommand(query2).CommandText.Dump();
query2.ToDictionary(o => o.OrderID, o => o.OrderDate).Dump();

Das generierte SQL ist (oder nur einen Blick auf die Registerkarte "SQL" von Linqpad):

// 1st approach
SELECT [t0].[OrderID], [t0].[OrderDate], [t0].[ShipCountry]
FROM [Orders] AS [t0]

// 2nd approach
SELECT [t0].[OrderID], [t0].[OrderDate]
FROM [Orders] AS [t0]

Nein. ToDictionary ist eine Erweiterungsmethode für IEnumerable<T> nicht IQueryable<T>. Es braucht keine Expression<Func<T, TKey>> aber einfach a Func<T, TKey> Dass es für jeden Artikel blindend anruft. Es ist es egal (und weiß es nicht) über Linq und die zugrunde liegenden Ausdrucksbäume und ähnliches. Es iteriert nur die Sequenz und baut ein Wörterbuch auf. Infolgedessen werden in Ihrer ersten Abfrage alle Spalten abgerufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top