Jak poprawnie przekonwertować dwie kolumny z SQL (2008) za pomocą Linq na słownik (do buforowania)?
Obecnie wykonuję pętlę przez IQueryable b / c Nie mogę uruchomić metody ToDictionary. Jakieś pomysły? To działa:
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);
}
To, co naprawdę chciałbym zrobić, to coś takiego, co wydaje się nie działać:
var dic = (from p in db.Table
select new {p.Key, p.Value })
.ToDictionary<string, string>(p => p.Key);
Ale pojawia się ten błąd: nie można przekonwertować z „System.Linq.IQueryable” na „System.Collections.Generic.IEnumerable”
c#
linq
linq-to-sql
Codewerks
źródło
źródło
kvp => kvp.Value as string
. Punktem odpowiedzi było.AsEnumerable()
.AsEnumerable
potrzebne? U mnie to też działa bez tego, ale prawdopodobnie Linq już się zmienił (minęło 7 lat)AsEnumerable
było to konieczne. Nie pamiętam dokładnie, dlaczego po tak długim czasie, ale możliwe wyjaśnienie jest takie, żeToDictionary
była to metoda rozszerzającaIEnumerable
, ale interfejs Linq-to-SQL nieIEnumerable
.Definiujesz tylko klucz, ale musisz również uwzględnić wartość:
var dic = (from p in db.Table select new {p.Key, p.Value }) .ToDictionary(p => p.Key, p=> p.Value);
źródło
<string, string>
część powoduje, że używapublic static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer);
przeciążenia zamiastpublic static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector);
przeciążenia..AsEnumerable()
wcześniej.ToDictionary()
Dzięki, wasze odpowiedzi pomogły mi to naprawić, powinny wyglądać tak:
var dic = db .Table .Select(p => new { p.Key, p.Value }) .AsEnumerable() .ToDictionary(k=> k.Key, v => v.Value);
źródło
Dlaczego miałbyś utworzyć anonimowy obiekt dla każdego elementu w tabeli tylko po to, aby go przekonwertować?
Możesz po prostu użyć czegoś takiego:
IDictionary<string, string> dic = db.Table.ToDictionary(row => row.Key, row => row.Value);
Być może będziesz musiał dołączyć wywołanie AsEnumerable () między Table i ToDictionary (). Nie znam dokładnego typu tabeli db.Table.Popraw również pierwszą próbkę, druga zmienna pętli jest niezgodna w deklaracji i użyciu.
źródło
ToDictionary
jest w pamięci. Brak tworzenia anonimowego obiektu oznacza, że wszystkie kolumny są pobierane z bazy danych, a nie tylko te, których potrzebujesz.ToDictionary
nie wie o podstawowej strukturze, po prostu wywołuje dwa wywołania zwrotne klucza i wartości (w tym przypadku prosta właściwość wybierająca lambdy), więc toToDictionary
wywołanie powinno być funkcjonalnie równoważne z foreach w podanym przez niego przykładzie. O ile wiem, wszystkie metody LINQ są odroczone, co oznacza, że wywołania zwrotne są wywoływane tylko wtedy, gdy jest to konieczne.