Подтвердить что ты не робот

Проецирование в KeyValuePair через EF/Linq

Я пытаюсь загрузить список KeyValuePairs из запроса EF/Linq, например:

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

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

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

4b9b3361

Ответ 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 → .