Tengo este error en esta expresión de linq:
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select new Payments
(
nalTmp.Dziecko.Imie,
nalTmp.Dziecko.Nazwisko,
nalTmp.Miesiace.Nazwa,
nalTmp.Kwota,
nalTmp.RodzajeOplat.NazwaRodzajuOplaty,
nalTmp.RodzajeOplat.TypyOplat.NazwaTypuOplaty,
nalTmp.DataRozliczenia,
nalTmp.TerminPlatnosci
)).ToList();
¿Alguna idea de cómo resolver este problema? Intento con cualquier combinación de expresión ...: /
c#
linq-to-entities
netmajor
fuente
fuente
Respuestas:
sin más información sobre 'Pagos', esto no ayuda mucho, pero suponiendo que desea crear un objeto de Pagos y establecer algunas de sus propiedades en función de los valores de las columnas:
fuente
Si aún desea utilizar su constructor para la inicialización y no las propiedades (a veces, este comportamiento es deseable para fines de inicialización), enumere la consulta llamando a
ToList()
oToArray()
, y luego useSelect(…)
. Por lo tanto, usará LINQ to Collections y esa limitación de no poder llamar al constructor con parámetros enSelect(…)
desaparecerá.Entonces su código debería verse así:
fuente
ToX()
para esto, usaAsEnumerable()
.Habiendo encontrado este error yo mismo, pensé que agregaría que si el
Payment
tipo es astruct
, también encontrarías el mismo error porquestruct
tipos no admiten constructores sin parámetros.En ese caso, la conversión
Payment
a una clase y el uso de la sintaxis del inicializador del objeto resolverán el problema.fuente
DateTime
(que es una estructura) dentro de mi consulta, que produce el mismo error. extraerlo a una variable local lo arregló para mí. Gracias por la sugerencia de estructura.Si eres como yo y no quieres tener que llenar tus propiedades para cada consulta que estás creando, hay otra forma de resolver este problema.
En este punto, tiene un IQueryable que contiene un objeto anónimo. Si desea llenar su objeto personalizado con un constructor, simplemente puede hacer algo como esto:
Ahora su objeto personalizado (que toma dos objetos como parámetro) puede llenar sus propiedades según sea necesario.
fuente
Primero evitaría la solución con
Esto requiere un constructor vacío e ignora la encapsulación, por lo que está diciendo que Payments () es un pago válido sin ningún dato, sino que el objeto debe tener al menos un valor y probablemente otros campos obligatorios dependiendo de su dominio.
Es mejor tener un constructor para los campos obligatorios pero solo traer los datos necesarios:
fuente
Puede intentar hacer lo mismo, pero utilizando los métodos de extensión. ¿Cuál es el proveedor del uso de la base de datos?
fuente
Sólo
ToList()
elDbSet
antes de laSelect
declaración .. el actualDbSet
se guarda como una consulta, no se ha cumplido todavía. Después de llamarToList()
, estás jugando con objetos, y luego puedes usar un constructor no predeterminado en la consulta.No es la forma más eficiente en cuanto al tiempo de uso, pero es una opción en conjuntos pequeños.
fuente
sí, inténtalo así ...
esto renovará su objeto de pago utilizando un constructor sin parámetros y luego inicializará las propiedades que se enumeran dentro de las llaves
{ }
fuente
()
en Payemnts no es necesario, por lo que puede ser `seleccione nuevos pagos {// valores de inicio}Además de los métodos mencionados anteriormente, también puede analizarlo como una colección Enumerable, de esta manera:
Esto también tiene el beneficio adicional de hacer la vida más fácil al construir un objeto anónimo, como este:
Sin embargo, al recordar que analizar una colección como Enumerable la lleva a la memoria, ¡puede requerir muchos recursos! Se debe tener precaución aquí.
fuente
Además, si desea utilizar un constructor con varios objetos para inicializar, es posible que obtenga un error si Linq no devuelve ningún valor.
Por lo tanto, es posible que desee hacer algo como esto:
fuente
Perdón por llegar tarde a la fiesta, pero después de encontrar esto , pensé que esto debería compartirse, ya que es la implementación más limpia, rápida y que también ahorra memoria que pude encontrar.
Adaptado a tu ejemplo, escribirías:
Las grandes ventajas aquí (como Damien Guard señaló en los comentarios en el enlace) son:
var foo = createPayments(bar);
así como el uso a través de myIQueryable.ToPayments () posible.fuente
Tuve el mismo problema hoy y mi solución fue similar a la que Yoda enumeró, sin embargo, solo funciona con sintaxis fluida.
Adaptando mi solución a su código: agregué el siguiente método estático a la clase de objeto
y luego actualizó la consulta base a lo siguiente:
Esto es lógicamente equivalente a la solución de James Manning con la ventaja de impulsar la gran cantidad de inicialización de miembros al objeto de transferencia de datos / clase
Nota: Originalmente estaba usando nombres más descriptivos que "Initializer", pero después de revisar cómo lo estaba usando, descubrí que "Initilizer" era suficiente (al menos para mis propósitos).
Nota final:
después de llegar a esta solución, originalmente pensé que sería simple compartir el mismo código y adaptarlo para que funcione también para la sintaxis de Query. Ya no creo que ese sea el caso. Creo que si desea poder utilizar este tipo de construcción abreviada, necesitaría un método para cada fluido (consulta, fluido) como se describe anteriormente, que puede existir en la clase de objeto en sí.
Para la sintaxis de consulta, se requeriría un método de extensión (o algún método fuera de la clase base que se utiliza). (dado que la sintaxis de consulta quiere operar un IQueryable en lugar de T)
Aquí hay una muestra de lo que solía hacer que finalmente funcione para la sintaxis de consulta. (Yoda ya clavó esto, pero creo que el uso podría ser más claro porque no lo entendí al principio)
y el uso
fuente
Aunque es tarde para responder, aún podría ayudar a alguien en apuros. Dado que LINQ to entidades no admite las construcciones de objetos sin parámetros. Sin embargo, los métodos de proyección para IEnumerable .
Entonces, antes de la selección, simplemente convierta su IQueryable a IEnumerable utilizando este código:
Funcionará bien Sin embargo, por supuesto, perderá los beneficios de las consultas nativas.
fuente
fuente