问题
I'm trying to load a list of KeyValuePairs from an EF / Linq query like this:
return (from o in context.myTable
select new KeyValuePair<int, string>(o.columnA, o.columnB)).ToList();
My problem is that this results in the error
"Only parameterless constructors and initializers are supported in LINQ to Entities."
Is there an easy way around this? I know I could create a custom class for this instead of using KeyValuePair but that does seem like re-inventing the wheel.
回答1:
Select only columnA and columnB from your table, and move further processing in memory:
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();
Consider also to create dictionary which contains KeyValuePairs:
return context.myTable.ToDictionary(o => o.columnA, o => o.columnB).ToList();
回答2:
Since LINQ to Entities does not support KeyValuePair
, you should turns to LINQ to Object by using AsEnumerable
first:
return context.myTable
.AsEnumerable()
.Select(new KeyValuePair<int, string>(o.columnA, o.columnB))
.ToList();
回答3:
There is also alternative, when you want to store multiple values for one key exists something what is called Lookup.
Represents a collection of keys each mapped to one or more values.
Here you have some official documentations.
More over lookup seems to be much faster than Dictionary < TKey, List < TValue > >.
来源:https://stackoverflow.com/questions/17301972/projecting-into-keyvaluepair-via-ef-linq