通过EF / Linq投射到KeyValuePair

时间:2013-06-25 15:53:33

标签: c# linq entity-framework projection keyvaluepair

我正在尝试从EF / Linq查询中加载KeyValuePairs列表,如下所示:

return (from o in context.myTable 
select new KeyValuePair<int, string>(o.columnA, o.columnB)).ToList();

我的问题是这会导致错误

  

“仅支持无参数构造函数和初始值设定项   LINQ to Entities。“

有一个简单的方法吗?我知道我可以为此创建一个自定义类而不是使用KeyValuePair,但这似乎重新发明了轮子。

3 个答案:

答案 0 :(得分:65)

仅从表中选择columnS和列,并在内存中移动进一步处理:

return context.myTable
              .Select(o => new { o.columnA, o.columnB }) // only two fields
              .AsEnumerable() // to clients memory
              .Select(o => new KeyValuePair<int, string>(o.columnA, o.columnB))
              .ToList();

还要考虑创建包含键值对的字典:

return context.myTable.ToDictionary(o => o.columnA, o => o.columnB).ToList();

答案 1 :(得分:10)

由于LINQ to Entities不支持KeyValuePair,因此您应首先使用AsEnumerable转到LINQ to Object:

return context.myTable
              .AsEnumerable()
              .Select(new KeyValuePair<int, string>(o.columnA, o.columnB))
              .ToList();

答案 2 :(得分:0)

还有另一种选择,当你想为一个键存储多个值时,会出现所谓的查找

  

表示每个映射到一个或多个值的键集合。

这里有一些官方documentations

查找的内容似乎比 Dictionary&lt;快得多TKey,List&lt; TValue&gt; &GT;