1

ラムダ式は匿名メソッドであり、内部ではデリゲートであるため、次のようなことができます。

 delegate bool Foo(int x);

 Foo bar = x => x == 1;

このデリゲートをEnumerable拡張メソッドに渡すことは、完全に理にかなっています。一般的に期待される引数は aFuncであり、これはデリゲートの省略形です。

 public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

Queryableただし、次のような拡張メソッドにデリゲートを渡す方法については不明です。

 public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);

このメソッドはExpression<TDelegate>引数を必要としますが、ラムダ式を渡すことは完全に合法です。ラムダ式をExpression<TDelegate>消費できるように強制するメカニズムは何ですか?

Queryable メソッドがプロバイダーによる解析用の式ツリーを構築するという事実はよく知っていますが、すぐにはわからないこの 1 つの側面にただ興味があります。

アップデート

私は自分の無知についてますます無知になってきています。ラムダ式はデリゲートではありませんが、デリゲートまたは式の作成に使用できます。

 Expression<Func<int, bool>> foo = c => c == 1;

コンパイラはコンテキストに基づいて型を推測しますか? これは合法ではないので、そうでなければならないと思います:

var foo = c => c == 1;
4

3 に答える 3

0

これは、クエリが IQueryable でどのように構築されているかに関係していると思います。このメソッドには式ツリーが必要です。これは、より最適化された (潜在的に) クエリに一致するように内部を調べたり構造化したり、基になるデータ ソースにより密接にマップしたりできるためです。したがって、単純に a を渡すとFunc実行のみが許可されますが、Expression < Func > を使用すると、観察および実行できる式ツリーが許可されます。

また、おそらくあなたの正確な質問にもっと厳密に答えるには、この SO 投稿をチェックしてください

于 2013-09-20T17:40:19.707 に答える