Проецирование в KeyValuePair через EF/Linq
Я пытаюсь загрузить список KeyValuePairs из запроса EF/Linq, например:
return (from o in context.myTable
select new KeyValuePair<int, string>(o.columnA, o.columnB)).ToList();
Моя проблема заключается в том, что это приводит к ошибке "Только конструкторы без инициализации и инициализаторы поддерживаются в LINQ для сущностей".
Есть ли простой способ обойти это? Я знаю, что я мог бы создать собственный класс для этого вместо использования KeyValuePair, но это похоже на повторное изобретательство колеса.
Ответы
Ответ 1
Выберите только столбец A и столбец B из вашей таблицы и переместите дальнейшую обработку в памяти:
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();
Ответ 2
Так как LINQ to Entities не поддерживает KeyValuePair
, вы должны перейти к LINQ to Object с помощью AsEnumerable
first:
return context.myTable
.AsEnumerable()
.Select(new KeyValuePair<int, string>(o.columnA, o.columnB))
.ToList();
Ответ 3
Существует также альтернатива, когда вы хотите сохранить несколько значений для одного ключа, существует нечто, что называется Поиск.
Представляет набор ключей, каждый из которых сопоставляется с одним или несколькими значениями.
Здесь у вас есть официальная документация.
Более чем поиск кажется намного быстрее, чем Dictionary < TKey, List < TValue → .