Linq-to-SQL ToDictionary () - PullRequest
       14

Linq-to-SQL ToDictionary ()

77 голосов
/ 29 октября 2008

Как правильно преобразовать два столбца из SQL (2008) с помощью Linq в словарь (для кэширования)?

В настоящее время я перебираю IQueryable, потому что не могу заставить метод 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'

Ответы [ 4 ]

116 голосов
/ 29 октября 2008
var dictionary = db
    .Table
    .Select(p => new { p.Key, p.Value })
    .AsEnumerable()
    .ToDictionary(kvp => kvp.Key, kvp => kvp.Value)
;
14 голосов
/ 29 октября 2008

Вы только определяете ключ, но вам нужно также указать значение:

var dic = (from p in db.Table
             select new {p.Key, p.Value })
            .ToDictionary(p => p.Key, p=> p.Value);
9 голосов
/ 29 октября 2008

Спасибо, ребята, ваши ответы помогли мне исправить это, должно быть:

var dic = db
        .Table
        .Select(p => new { p.Key, p.Value })
        .AsEnumerable()
        .ToDictionary(k=> k.Key, v => v.Value);
1 голос
/ 18 января 2010

Зачем вам создавать анонимный объект для каждого элемента в таблице, чтобы преобразовать его?

Вы можете просто использовать что-то вроде: IDictionary<string, string> dic = db.Table.ToDictionary(row => row.Key, row => row.Value); Возможно, вам придется включить вызов AsEnumerable () между Table и ToDictionary (). Я не знаю точный тип db.Table.


Также исправьте первый пример, ваша вторая переменная цикла не соответствует при объявлении и использовании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...