c# - Proyección en KeyValuePair a través de EF/Linq
entity-framework projection (3)
Como LINQ to Entities no es compatible con KeyValuePair
, KeyValuePair
debe usar LINQ to Object utilizando AsEnumerable
:
return context.myTable
.AsEnumerable()
.Select(new KeyValuePair<int, string>(o.columnA, o.columnB))
.ToList();
Estoy intentando cargar una lista de KeyValuePairs de una consulta EF / Linq como esta:
return (from o in context.myTable
select new KeyValuePair<int, string>(o.columnA, o.columnB)).ToList();
Mi problema es que esto resulta en el error.
"Solo LINQ para Entidades admite constructores e inicializadores sin parámetros".
¿Hay una manera fácil de evitar esto? Sé que podría crear una clase personalizada para esto en lugar de usar KeyValuePair, pero eso parece re-inventar la rueda.
Seleccione solo columnA y columnB de su tabla y mueva el procesamiento adicional en la memoria:
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();
Considera también crear un diccionario que contenga KeyValuePairs:
return context.myTable.ToDictionary(o => o.columnA, o => o.columnB).ToList();
También hay una alternativa, cuando desea almacenar múltiples valores para una clave existe algo que se llama Búsqueda .
Representa una colección de claves cada una asignada a uno o más valores.
Aquí tenéis algunas documentations oficiales.
Más sobre la búsqueda parece ser mucho más rápido que el Diccionario <TKey, List <TValue>>.