2

私は、データベースからオブジェクトを追加、編集、および削除するための小さなヘルパーに取り組んでいます。 add メソッドは現在機能しており、タイプ t のオブジェクトを指定すると、プロパティ、値をチェックし、SQL クエリを生成して挿入しますテーブルへのデータ (テーブル名はオブジェクトの型であると仮定しますが、手動で設定することもできます)

今やりたいのはメソッド

public bool Update<T>(T obj, Func<T, bool> predicate)

T objとラムダ関数predicateが与えられた場合、 predicate が

(o => o.Id = 1)

生成したい

WHERE Id = 1

同様の質問をいくつか見たことがあります。式ツリーは出発点として適していると思いますが、デリゲートから式を作成する方法ではなく、手動で式を作成する方法しか見ていません。

デリゲートからその SQL を生成する方法はありますか?

編集: ついにやりたいことができたので、ここに少し投稿しました。

4

2 に答える 2

6

式を直接使用する必要があります。

public bool Update<T>(T obj, Expression<Func<T, bool>> predicate)

これを同じ方法で呼び出します。

Update(obj, o => o.Id = 1);

これにより完全な式ツリーが提供され、それを解読して SQL に変換できます。Func<T,bool>コンパイラは、デリゲートの場合と同様に、ラムダから式ツリーを構築します。

式ツリーを取得したら、あなたの場合、ExpressionVisitorを作成してツリーを解析し、結果に変換するすべての Where ステートメントを見つけることができるはずです。WHERE Id = 1

于 2012-10-11T19:32:38.057 に答える
1

デリゲートから式ツリーを作成することは完全に不可能です。

代わりに、式ツリーを取得するようにメソッドを変更する必要があります。
コンパイラは、呼び出し元がパラメーターとしてラムダ式を渡すことを許可し、式ツリーにコンパイルします。

于 2012-10-11T19:32:18.447 に答える