次のテーブル構造を想像してください
---------
TableA
ID
Name
---------
TableB
ID
TableAID
---------
TableC
ID
TableBID
Expression<Func<TableA, TableB, TableC, T>>
これら 3 つのテーブルを結合し、 をセレクタとして受け入れる関数を定義したいと考えています。
だから私は次のようなものが欲しいです:
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
により、式タイプが得られます。メソッド チェーン構文を使用することもできますが、メソッド チェーンの呼び出しごとに 1 つずつ、複数のセレクターが必要になります。次の不完全な関数のように、セレクターを取得して匿名型に適用する方法はありますか:
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);
}
これをどのように行うことができるかについてのアイデアはありますか?