2012-01-09 15 views
2

から式ツリーを作成:実行時に私はラムダ式持ってラムダ

(x) => x.Visits++ 

を、私は文字列にこれを翻訳したい:

"set Visits = Visits + 1" 

または、潜在的に、基礎となるデータストアがある場合異なっている(MongoDBのような)

{$inc: {Visits : 1}} 

これを行う方法は表現木を使うことだと思うが、ラムダ私は "式ツリーに代入演算子が含まれていないかもしれません"ということになります。

Updateをサポートする完全なLinq実装を作成するには、この方法がありますか?

+0

これは[Lambda to Expression tree conversion](http://stackoverflow.com/questions/1310752/lambda-to-expression-tree-conversion)に役立つでしょうか? – oleksii

+0

@oleksiiこの場合はありません。 '式<...> 'がなければ(デリゲートとして)コンパイルされます。 「式<...>」と入力しても表示されません。 –

+0

このヘルプ(linqpad用)のようなものはありますか? int i = 0; Func inc = x => ++ x; Func dec = x => - x; 式> f = x => inc(dec(inc(x))); while(i <10) { \t i = f.Compile()(i); \t i.Dump(); } f.Dump(); – CrazyDart

答えて

3

現在のC#コンパイラでは単純にサポートされていませんが、vNextの変更については聞いていません。もちろん、厳密にはと定義されていますが、C#3/4では定義されていません - 「他の場所で定義されています」(実際にはAFAIK:式ツリー構造を処理する仕様は正式には文書化されていません。仕様変更が必要であると主張するのは難しいので、肯定的なことです。

面白いことは、次のとおりです。以降、.NET 4.0から、サポートが変異しない式ツリーAPI(このケースでは、Expression.IncrementExpression.PostIncrementAssignを参照してください) - あなたはExpression.*コードを経由して、実行時に式ツリーを作成することができ、率直に言って、それは痛みではありません。したがって、の潜在的ながこれに変わりますが、それほど希望はありません。

また、を再度取り戻すための式ツリー解析は、を再度取り戻すことは些細なことではありません。やってよ、確かに。簡単:いいえ。

+2

ええ、私たちはそのスペックを出荷したことはありません、申し訳ありません。式ツリーAPIについては、文lambdaから式ツリーへの変換をサポートすることを考慮して、考慮しました。つまり、(ダイナミックな、または非同期的な)より面白い仕事をキャンセルまたは遅延させるほどの魅力的なエンドユーザーシナリオはありません。これらの穴を埋めるのはいいですが、「いいです」とは魅力的ではありません。 –

+0

おしゃれなMarkとEric。 – oleksii

+0

Marc - ありがとう、2番目のステップは重要ではありませんが、確かにlinqプロバイダを実装するよりも難しくありません。私はLinqより軽いものを、APIのエンドユーザから隠蔽し、基礎となるストレージプロバイダには無関係なクエリフォーマットを提供したいと思っていました。私はそれがうまくいくことを確信していました。しかたがない。 –