Ответ 1
var dictionary = db
.Table
.Select(p => new { p.Key, p.Value })
.AsEnumerable()
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value)
;
Как правильно преобразовать два столбца из SQL (2008) с помощью Linq в словарь (для кэширования)?
В настоящее время я просматриваю IQueryable b/c, я не могу заставить метод ToDictionary работать. Есть идеи? Это работает:
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);
}
То, что я действительно хотел бы сделать, это что-то вроде этого, которое, похоже, не работает:
var dic = (from p in db.Table
select new {p.Key, p.Value })
.ToDictionary<string, string>(p => p.Key);
Но я получаю эту ошибку: Невозможно преобразовать из "System.Linq.IQueryable" в "System.Collections.Generic.IEnumerable"
var dictionary = db
.Table
.Select(p => new { p.Key, p.Value })
.AsEnumerable()
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value)
;
Вы определяете только ключ, но вам нужно также включить это значение:
var dic = (from p in db.Table
select new {p.Key, p.Value })
.ToDictionary(p => p.Key, p=> p.Value);
Спасибо, ребята, ваши ответы помогли мне исправить это, должно быть:
var dic = db
.Table
.Select(p => new { p.Key, p.Value })
.AsEnumerable()
.ToDictionary(k=> k.Key, v => v.Value);
Зачем вам создавать анонимный объект для каждого элемента таблицы только для его преобразования?
Вы можете просто использовать что-то вроде:
IDictionary<string, string> dic = db.Table.ToDictionary(row => row.Key, row => row.Value);
Возможно, вам потребуется включить вызов AsEnumerable() между таблицей и ToDictionary().
Я не знаю точного типа db.Table.
Также исправьте первый образец, ваша вторая переменная цикла несовместима с объявлением и использованием.