Ich hatte heute das gleiche Problem und meine Lösung ähnelte der von Yoda aufgelisteten, funktioniert jedoch nur mit fließender Syntax.
Anpassen meiner Lösung an Ihren Code: Ich habe der Objektklasse die folgende statische Methode hinzugefügt
/// <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
};
}
und aktualisierte dann die Basisabfrage auf Folgendes:
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select new Payments.Initializer());
Dies entspricht logischerweise der Lösung von James Manning mit dem Vorteil, dass das Aufblähen der Elementinitialisierung auf das Klassen- / Datenübertragungsobjekt übertragen wird
Hinweis: Ursprünglich verwendete ich aussagekräftigere Namen als "Initializer", aber nachdem ich überprüft hatte, wie ich ihn verwendete, stellte ich fest, dass "Initilizer" ausreichend war (zumindest für meine Zwecke).
Schlussbemerkung:
Nachdem ich diese Lösung entwickelt hatte, dachte ich ursprünglich, es wäre einfach, denselben Code zu teilen und diesen anzupassen, um auch für die Abfragesyntax zu funktionieren. Ich glaube nicht mehr, dass dies der Fall ist. Ich denke, wenn Sie in der Lage sein möchten, diese Art der Kurzschriftkonstruktion zu verwenden, benötigen Sie eine Methode für jede (Abfrage, fließend) fließend wie oben beschrieben, die in der Objektklasse selbst vorhanden sein kann.
Für die Abfragesyntax wäre eine Erweiterungsmethode (oder eine Methode außerhalb der verwendeten Basisklasse) erforderlich. (da die Abfragesyntax eher ein IQueryable als ein T betreiben möchte)
Hier ist ein Beispiel dessen, was ich verwendet habe, um dies endlich für die Abfragesyntax zum Laufen zu bringen. (Yoda hat das bereits verstanden, aber ich denke, die Verwendung könnte klarer sein, weil ich es zuerst nicht verstanden habe.)
/// <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
};
}
und die Verwendung
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select nalTmp).Initializer().ToList();