今日も同じ問題があり、私の解決策はヨーダがリストしたものに似ていましたが、それは流暢な構文でのみ機能します。
私のソリューションをコードに適応させる:次の静的メソッドをオブジェクトクラスに追加しました
/// <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
};
}
次に、基本クエリを次のように更新しました。
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select new Payments.Initializer());
これは、論理的にはJames Manningのソリューションと同等であり、メンバー初期化の膨張をクラス/データ転送オブジェクトにプッシュするという利点があります。
注:元々は「Initializer」よりもわかりやすい名前を使用していましたが、使用方法を確認したところ、「少なくともInitilizer」で十分であることがわかりました(少なくとも私の目的では)。
最終メモ:
このソリューションを思いついた後、最初は同じコードを共有し、これをクエリ構文でも機能するように調整するのは簡単だと思っていました。私はもはやそうであるとは思わない。このタイプの速記構文を使用できるようにしたい場合は、オブジェクトクラス自体に存在できる上記の各(query、fluent)fluentのメソッドが必要になると思います。
クエリ構文の場合、拡張メソッド(または使用されている基本クラス外のメソッド)が必要になります。(クエリ構文ではTではなくIQueryableを操作する必要があるため)
これが最終的にこれをクエリ構文で機能させるために使用したもののサンプルです。(ヨーダはすでにこれを釘付けにしたが、私は最初にそれを得なかったので、使用法はより明確になると私は思う)
/// <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
};
}
と使い方
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select nalTmp).Initializer().ToList();