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
/// <summary>
/// use this instead of a parameritized constructor when you need support
/// for LINQ to entities (fluent syntax only)
/// </summary>
/// <returns></returns>
public static Func<Naleznosci, Payments> Initializer()
{
return n => new Payments
{
Imie = n.Dziecko.Imie,
Nazwisko = n.Dziecko.Nazwisko,
Nazwa = n.Miesiace.Nazwa,
Kwota = n.Kwota,
NazwaRodzajuOplaty = n.RodzajeOplat.NazwaRodzajuOplaty,
NazwaTypuOplaty = n.RodzajeOplat.TypyOplat.NazwaTypuOplaty,
DataRozliczenia = n.DataRozliczenia,
TerminPlatnosc = n.TerminPlatnosci
};
}
y luego actualizó la consulta base a lo siguiente:
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select new Payments.Initializer());
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)
/// <summary>
/// use this instead of a parameritized constructor when you need support
/// for LINQ to entities (query syntax only)
/// </summary>
/// <returns></returns>
public static IQueryable<Payments> Initializer(this IQueryable<Naleznosci> source)
{
return source.Select(
n => new Payments
{
Imie = n.Dziecko.Imie,
Nazwisko = n.Dziecko.Nazwisko,
Nazwa = n.Miesiace.Nazwa,
Kwota = n.Kwota,
NazwaRodzajuOplaty = n.RodzajeOplat.NazwaRodzajuOplaty,
NazwaTypuOplaty = n.RodzajeOplat.TypyOplat.NazwaTypuOplaty,
DataRozliczenia = n.DataRozliczenia,
TerminPlatnosc = n.TerminPlatnosci
};
}
y el uso
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select nalTmp).Initializer().ToList();