1

Predicate Builder を使用して式ツリーを作成する簡単な方法はありますか。凝縮できる多くのコードのように思えます。

Expression<Func<EventGymCourt, object>> gymCourt = q => q.GymCourt;
Expression<Func<EventGymCourt, object>> gym = q => q.GymCourt.Gym;
Expression<Func<EventGymCourt, object>> address = q => q.GymCourt.Gym.Address;

_eventGymCourtRepository.GetWithStart(page, pageSize, new[] { gymCourt, gym, address }....
4

3 に答える 3

1

さて、、、およびメンバーのタイプがすべてGymCourtであるとは思えないので、タイプ推論を取得してあなたに有利に働くことは難しいでしょう。GymAddressobject

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ではなくである必要があるため、これはあなたの例ではそれほど有用ではないと思います。PredicateBuilderobject

しかし、式の戻り型として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;
}

それはあなたの状況に直接適合するわけではありませんが、ツールキットに含めるのは良いことです。

于 2011-12-23T04:27:47.940 に答える
0

初期化の凝縮を意味する場合は、式ツリー変数に var キーワードを使用し、特定の式を単に返す特別な拡張メソッド ToExpression を記述できます (ただし、関数と式を区別するためにコンパイラで必要です)。

于 2011-12-19T09:53:13.747 に答える
0

jb evain でMono.Linq.Expressionsを確認できます

于 2012-04-05T17:00:24.063 に答える