Wie konvertiere ich zwei Spalten aus SQL (2008) mit Linq ordnungsgemäß in ein Wörterbuch (zum Zwischenspeichern)?
Ich durchlaufe derzeit das IQueryable b / c. Ich kann die ToDictionary-Methode nicht zum Laufen bringen. Irgendwelche Ideen? Das funktioniert:
var query = from p in db.Table
select p;
Dictionary<string, string> dic = new Dictionary<string, string>();
foreach (var p in query)
{
dic.Add(sub.Key, sub.Value);
}
Was ich wirklich gerne machen würde, ist so etwas, was nicht zu funktionieren scheint:
var dic = (from p in db.Table
select new {p.Key, p.Value })
.ToDictionary<string, string>(p => p.Key);
Ich erhalte jedoch die folgende Fehlermeldung: Konvertierung von 'System.Linq.IQueryable' in 'System.Collections.Generic.IEnumerable' nicht möglich.
c#
linq
linq-to-sql
Codewerks
quelle
quelle
kvp => kvp.Value as string
. Der Punkt der Antwort war.AsEnumerable()
.AsEnumerable
benötigt? Für mich funktioniert es auch ohne das, aber wahrscheinlich hat sich Linq bereits geändert (7 Jahre sind vergangen)AsEnumerable
notwendig. Ich erinnere mich nicht genau, warum nach all dieser Zeit, aber eine mögliche Erklärung ist, dassToDictionary
es sich um eine Erweiterungsmethode handelteIEnumerable
, die Schnittstelle für Linq-to-SQL jedoch nichtIEnumerable
.Sie definieren nur den Schlüssel, müssen aber auch den Wert angeben:
var dic = (from p in db.Table select new {p.Key, p.Value }) .ToDictionary(p => p.Key, p=> p.Value);
quelle
<string, string>
Teil diepublic static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer);
Überlastung anstelle derpublic static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector);
Überlastung verwendet..AsEnumerable()
vorher.ToDictionary()
Danke Jungs, eure Antworten haben mir geholfen, das zu beheben, sollten sein:
var dic = db .Table .Select(p => new { p.Key, p.Value }) .AsEnumerable() .ToDictionary(k=> k.Key, v => v.Value);
quelle
Warum sollten Sie für jedes Element in der Tabelle ein anonymes Objekt erstellen, um es zu konvertieren?
Sie können einfach
IDictionary<string, string> dic = db.Table.ToDictionary(row => row.Key, row => row.Value);
Folgendes verwenden: Möglicherweise müssen Sie einen AsEnumerable () -Aufruf zwischen Table und ToDictionary () einfügen. Ich kenne den genauen Typ der Datenbank nicht.Korrigieren Sie auch das erste Beispiel. Ihre zweite Schleifenvariable stimmt bei Deklaration und Verwendung nicht überein.
quelle
ToDictionary
im Speicher ist. Wenn Sie kein anonymes Objekt erstellen, werden alle Spalten aus der Datenbank abgerufen und nicht nur die von Ihnen benötigten.ToDictionary
kennt die zugrunde liegende Struktur nicht, ruft nur die beiden Rückrufe für Schlüssel und Wert auf (in diesem Fall einfache Eigenschaft zur Auswahl von Lambdas), daher sollte dieserToDictionary
Aufruf funktional dem foreach in dem von ihm bereitgestellten Beispiel entsprechen. Soweit ich weiß, werden alle LINQ-Methoden zurückgestellt, dh Rückrufe werden nur bei Bedarf aufgerufen.