さて、、、およびメンバーのタイプがすべてGymCourt
であるとは思えないので、タイプ推論を取得してあなたに有利に働くことは難しいでしょう。Gym
Address
object
1つの方法は、配列初期化子を使用することです。
Expression<Func<EventGymCourt, object>>[] exprs
= { q => q.GymCourt, q => q.GymCourt.Gym, q => q.GymCourt.Gym.Address };
_eventGymCourtRepository.GetWithStart(page, pageSize, exprs);
個別の変数で各式が本当に必要な場合は、using
-aliasを使用して変数type-declarationを短縮できます。
// At the top of your file....
using CourtObjectExpr =
System.Linq.Expressions.Expression<System.Func<MyNameSpace.EventGymCourt, object>>;
...
CourtObjectExpr gymCourt = q => q.GymCourt;
CourtObjectExpr gym = q => q.GymCourt.Gym;
CourtObjectExpr address = q => q.GymCourt.Gym.Address;
ちなみに、あなたはLINQKit(を含むライブラリ)Linq.Expr
からメソッドを検索しているようです。これは、コンパイラの型推論機能を使用して、一般的なシナリオでラムダから式ツリーへの変換を凝縮します。式のreturn-typeがproperty-typeではなくである必要があるため、これはあなたの例ではそれほど有用ではないと思います。PredicateBuilder
object
しかし、式の戻り型としてproperty-typeを使用して式を作成したい場合は、次のようにすることができます(非常に簡潔に)。
// Not directly applicable to your scenario (you can add a cast).
var gymCourt = Linq.Expr((EventGymCourt q) => q.GymCourt);
var gym = Linq.Expr((EventGymCourt q) => q.GymCourt.Gym);
var address = Linq.Expr((EventGymCourt q) => q.GymCourt.Gym.Address);
これにより、コンパイラの型推論が有利に機能します。メソッドのソースコードは次のように単純です。
public static Expression<Func<T, TResult>> Expr<T, TResult>
(Expression<Func<T, TResult>> expr)
{
return expr;
}
それはあなたの状況に直接適合するわけではありませんが、ツールキットに含めるのは良いことです。