通过EF/Linq投射到KeyValuePair

Gra*_*ush 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();
Run Code Online (Sandbox Code Playgroud)

我的问题是,这会导致错误

"LINQ to Entities中仅支持无参数构造函数和初始值设定项."

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

Ser*_*kiy 70

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

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();
Run Code Online (Sandbox Code Playgroud)

还要考虑创建包含KeyValuePairs的字典:

return context.myTable.ToDictionary(o => o.columnA, o => o.columnB).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 注意:这个工作的原因是因为LINQ-to-Entities只支持无参数构造函数,所以你不能使用`new KeyValuePair ...`.LINQ-to-Collections确实支持带参数的构造函数.当你调用`AsEnumerable()`时,它会评估EF查询,然后是LINQ-to-Collections,它处理以下`.Select()` (7认同)

cuo*_*gle 10

由于LINQ to Entities不支持KeyValuePair,您应该AsEnumerable首先使用LINQ to Object :

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

  • 虽然这有效,但它从myTable加载所有列时效率很低 (8认同)