は、私はこれらの3つのテーブルを結合し、セレクタとしてExpression<Func<TableA, TableB, TableC, T>>
を受け入れる関数を定義したい以下のテーブル構造LINQ倍でのIQueryableを結合結果セレクタ式
---------
TableA
ID
Name
---------
TableB
ID
TableAID
---------
TableC
ID
TableBID
を想像して変更します。
だから私は、次のようなものたい:上記の私はそれがやりたいしません
今public IQueryable<T> GetJoinedView<T>(Expression<Func<TableA, TableB, TableC, T>> selector)
{
return from a in DbContext.Set<TableA>()
join b on DbContext.Set<TableB>() a.ID equals b.TableAID
join c on DbContext.Set<TableC>() b.ID equals c.TableBID
select selector;
}
を、明らかに、これは私の表現型のIQueryable
を与えるだろう。私はメソッド連鎖構文を使うことができましたが、結局、メソッド連鎖呼び出しごとに複数のセレクタが必要になりました。これを行うことができる方法についての
public IQueryable<T> GetJoinedView<T>(Expression<Func<TableA, TableB, TableC, T>> selector)
{
var query = from a in DbContext.Set<TableA>()
join b on DbContext.Set<TableB>() a.ID equals b.TableAID
join c on DbContext.Set<TableC>() b.ID equals c.TableBID
select new
{
A = a, B = b, C = c
};
// I need the input selector to be modified to be able to operate on
// the above anonymous type
var resultSelector = ModifyInputSelectorToOperatorOnAnonymousType(selector);
return query.Select(resultSelector);
}
任意のアイデア:セレクタを取ると、次の不完全な機能のように匿名型に適用する方法はありますか?
メソッドはいくつかの異なる場所から呼び出され、データベースで選択を実行できる必要があります。提供されるソリューションがデータベース上で実行されるとは思わないが、実際にはTargetInvocationExceptionが発生する可能性があります。 – mhand
EFはIQueryableの式ツリーでマッピングされていない型を使用できるように修正しました。 – mhand
ええ、得られた式ツリーがSQLに変換できる限り、それはすべて良いです。 – Ocelot20