代码之家  ›  专栏  ›  技术社区  ›  Codewerks

Linq到SQL ToDictionary()。

  •  76
  • Codewerks  · 技术社区  · 16 年前

    如何使用LINQ将SQL(2008)中的两列正确转换为字典(用于缓存)?

    我目前循环通过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”

    4 回复  |  直到 11 年前
        1
  •  114
  •   yfeldblum    16 年前
    var dictionary = db
        .Table
        .Select(p => new { p.Key, p.Value })
        .AsEnumerable()
        .ToDictionary(kvp => kvp.Key, kvp => kvp.Value)
    ;
    
        2
  •  14
  •   Indy9000    11 年前

    您只定义了键,但还需要包括值:

    var dic = (from p in db.Table
                 select new {p.Key, p.Value })
                .ToDictionary(p => p.Key, p=> p.Value);
    
        3
  •  9
  •   Codewerks    16 年前

    谢谢各位,你们的回答帮助我解决了这个问题,应该是:

    var dic = db
            .Table
            .Select(p => new { p.Key, p.Value })
            .AsEnumerable()
            .ToDictionary(k=> k.Key, v => v.Value);
    
        4
  •  1
  •   TWiStErRob    14 年前

    为什么只为表中的每个项创建一个匿名对象来转换它?

    您可以简单地使用如下内容: IDictionary<string, string> dic = db.Table.ToDictionary(row => row.Key, row => row.Value); 您可能需要在Table和ToDictionary()之间包含AsEnumerable()调用。 我不知道db.table的确切类型。


    还要更正第一个示例,您的第二个循环变量在声明和用法上不匹配。