J'ai eu le même problème aujourd'hui et ma solution était similaire à celle répertoriée par Yoda, mais elle ne fonctionne qu'avec une syntaxe fluide.
Adapter ma solution à votre code: j'ai ajouté la méthode statique suivante à la classe d'objets
/// <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
};
}
puis a mis à jour la requête de base comme suit:
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select new Payments.Initializer());
Ceci est logiquement équivalent à la solution de James Manning avec l'avantage de pousser le gonflement de l'initialisation des membres vers l'objet de transfert de classe / données
Remarque: À l'origine, j'utilisais des noms plus descriptifs que "Initializer" mais après avoir examiné comment je l'utilisais, j'ai trouvé que "Initilizer" était suffisant (du moins pour mes besoins).
Note finale:
Après avoir proposé cette solution, je pensais à l'origine qu'il serait simple de partager le même code et de l'adapter pour qu'il fonctionne également pour la syntaxe de requête. Je ne pense plus que ce soit le cas. Je pense que si vous voulez pouvoir utiliser ce type de construction abrégée, vous auriez besoin d'une méthode pour chaque (requête, fluent) fluide comme décrit ci-dessus qui peut exister dans la classe d'objets elle-même.
Pour la syntaxe de requête, une méthode d'extension (ou une méthode en dehors de la classe de base utilisée) serait requise. (puisque la syntaxe de requête veut faire fonctionner un IQueryable plutôt que T)
Voici un exemple de ce que j'ai utilisé pour que cela fonctionne enfin pour la syntaxe de requête. (Yoda l'a déjà cloué mais je pense que l'utilisation pourrait être plus claire car je ne l'ai pas compris au début)
/// <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
};
}
et l'utilisation
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select nalTmp).Initializer().ToList();