5

Expression<Func<T,bool>>複数の式を組み合わせることができる次の質問を見つけました。

呼び出しなしで2つのC#ラムダ式をマージする方法は?

同様の手法を使用して、どのように .OrderByExpression<Func<Entity, Key>>を .WhereExpression<Func<Entity, bool>>型の 1 つの Expression にマージするのか、それとも型から継承するのか疑問に思っていますSystem.Linq.Expressions.Expression

私は、T => T == ...パブリック メソッド.Where.OrderBy. これは、このクラスが作成する式を QueryTranslator に渡して適切な SQL を作成することを意図しています。

このスタイルの QueryTranslator は、QueryProvider から呼び出されると、通常、1 つSystem.Linq.Expressions.Expressionを引数として取り、SQL に変換します。

.Where2 つのFuncをマージするための上記の質問を理解して理解することができます。次のブログ投稿はこれに特に役立ち、各例をたどりました。

http://blogs.msdn.com/b/meek/archive/2008/05/02/linq-to-entities-combining-predicates.aspx

この CodeProject の記事も役に立ちました。

http://www.codeproject.com/Articles/24255/Exploring-Lambda-Expression-in-C

ただし、.OrderBy Func を .Where Func と組み合わせる場合、2 つのジェネリック引数は異なります。.Where の場合は 、Func<Entity, bool>.OrderBy の場合はFunc<Entity, Key>.

これら 2 つの式をマージすることは、表面的には、同じ一般的な引数を持つ 2 つをマージするほど簡単ではありません。

組み込みの Func-Expression-producing-engine (正確な用語は不明) は、.Where Func と .OrderBy Func を組み合わせることができます。この 2 つの表現が合体して 1 つになったとき、その内部で何が起こるのか、私は興味がありSystem.Linq.Expressions.Expressionます。可能であれば、各式でエンティティが同じタイプであると仮定してExpression<Func<Entity, bool>>、をどのように組み合わせますか?Expression<Func<Entity,Key>>

4

2 に答える 2

3
public IQueryable<T> ApplyExpressions<T, TKey>(
  Expression<Func<T, TKey>> sortBy,
  Expression<Func<T, bool>> filterBy,
  IQueryable<T> source)
{
  return source.Where(filterBy).OrderBy(sortBy);
}


IQueryable<Customer> query = ApplyExpressions<Customer, int>(
  c => c.Age,
  c => c.Name.StartsWith("B"),
  myDC.Customers)

Expression queryExpression = query.Expression;  //tada
于 2012-06-14T19:28:25.417 に答える
0

この質問があいまいになったのは、答えられないからだと思います。

IQueryable<>エクスプレッション ビルダーがどのように機能し.Where.OrderByエクスプレッションをすべて 1 つのエクスプレッションで処理するかなど、1 つの超エクスプレッションを構築しようとしていました。

ただし、サブジェクトがなければ、式と式ツリーに関する私の限られた理解は、それが不可能であることを示唆しているようです。

.Where式と式を 1 つの Expressionに結合するには、 で 2 つの を分離する.OrderBy必要があります 。 MethodCallExpressionLambdaExpression

MethodCallExpressionメソッドを呼び出すサブジェクトが必要です。ここでIQueryable<>が使用されます。

Query クラスを変更して、すべてLambdaExpressionの を分離し、これらを別々に QueryTranslator に渡します。QT は、出力 SQL を適切な場所にマージします。

これは、IQueryable<>1 つのスーパー式を分析し、式の に基づいて適切な場所に SQL を出力する QueryProvider とは対照的MethodCallExpressionです。

于 2012-06-15T16:31:23.637 に答える