2013-06-25 2 views
24

Я пытаюсь загрузить список KeyValuePairs из EF/Linq запрос следующим образом:Проецирование в KeyValuePair с помощью EF/Linq

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

Моя проблема заключается в том, что это приводит к ошибке «Только без параметров конструкторам и инициализаторы поддерживаются в LINQ для сущностей ».

Есть ли простой способ обойти это? Я знаю, что я мог бы создать собственный класс для этого вместо использования KeyValuePair, но это похоже на повторное изобретательство колеса.

+0

Обсуждение по вопросам агрегирования в качестве альтернативного варианта: http://social.msdn.microsoft.com/Forums/en-US/513350db-6f1e-4930-87e9-81a04f574b54/linq-select-projection-vs-classic- for-loop-which-one-is-better –

ответ

50

Выберите только 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(); 

Рассмотрим также создать словарь, который содержит KeyValuePairs:

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

NB: причина этого в том, что LINQ-to-Entities поддерживает только конструкторы без параметров, поэтому вы не можете использовать 'new KeyValuePair ...'. LINQ-to-Collections поддерживает конструкторы с параметрами. Когда вы вызываете 'AsEnumerable()', он вычисляет EF-запрос, а затем LINQ-to-Collections, который обрабатывает следующие '.Select()' – Rory

+0

. Как реализовать версию ASYNC? Нет метода 'AsEnumerableAsync()'. – Zapnologica

6

Поскольку LINQ к Entities не поддерживает KeyValuePair, вы должны превращается в LINQ к объекту с помощью AsEnumerable первым:

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

, хотя это работает, он неэффективен, поскольку он загружает все столбцы из myTable –

0

Существует также альтернатива, когда вы хотите сохранить несколько значений для одного ключа, существует нечто, что называется Поиск.

Представляет собой набор ключей, каждый из которых сопоставляется одному или нескольким значениям.

У вас есть официальное сообщение documentations.

Более поиска, кажется, гораздо быстрее, чем словарь < TKey, List < TValue>>.