EnitityFramework 6を使用して、入力タイプ(データベースエンティティ)のIQueryable
を取得し、出力タイプのIQueryable
を返すメソッドを作成します。コンバータクラスには、入力タイプの単一インスタンスを出力タイプの単一インスタンスに変換するメソッドもあります。 .Select
ラムダパラメータに変換する方法を使用すると、実行時例外が発生します。Linq to Entities InvertType in IQueryable
System.NotSupportedException:メソッド「バー変換(フー)」メソッド、およびこの方法を認識しないエンティティへのLINQは、ストアに翻訳することはできません表現。
internal static class FooConverter
{
internal static IQueryable<Bar> Convert(IQueryable<Foo> foos)
{
return foos.Select(d => Convert(d));
}
internal static Bar Convert(Foo foo)
{
return new Bar
{
Id = foo.Id,
Number = foo.Number,
Valid = foo.Valid ?? false,
};
}
}
研究は、LINQのエンティティに私のConvert(Foo)
方法からSQLを生成することができないので、私はいくつかのリファクタリングをしたことを示唆しています。両方の方法で初期化を複製すると、すべてが機能します。
internal static class FooConverter
{
internal static IQueryable<Bar> Convert(IQueryable<Foo> foos)
{
return foos
.Select(d => new Bar
{
Id = foo.Id,
Number = foo.Number,
Valid = foo.Valid ?? false,
)};
}
internal static Bar Convert(Foo foo)
{
return new Bar
{
Id = foo.Id,
Number = foo.Number,
Valid = foo.Valid ?? false,
};
}
}
しかし、今ではコードが重複しています。冗長性を排除するためにConvert(Foo)
をConvert(IQueryable<Foo>)
から呼び出すことは可能ですか?
問題は、式中のIQueryable取引ということです。クエリプロバイダは、式ツリーを歩き回って、それを知っているすべてのものをSQLに変換します。しかし、それは表面上のものだけを翻訳することができます。任意のメソッド呼び出しを、投影に必要なNewExpression/MemberInitExpressionsに変換する方法を理解していません。変換する必要がない場合は、式を返してから、デリゲートにコンパイル()して、LINQ以外の方法で使用するようにしてください。 – pinkfloydx33
ありがとうございますpinkfloyd。私は表現式に精通していませんでしたが、あなたのコメントは私を正しい方向に導いてくれました。 https://msdn.microsoft.com/en-us/library/bb335710(v=vs.110).aspx –
chadnt