2011-07-06 6 views
3

SQL where節を取得するには、式ツリーを解析する必要があります。Sqlstringに式ツリーを解析する - ホイールを再作成しない

既にこの機能を備えている.NET FXやサードパーティのライブラリにはクラスはありませんか?

私はLinq2SQL、EntityFrameworkを意味していますが、そのすべてがこれを行う必要があります。ホイールを再発明する代わりに再利用できるものがあれば誰でも知っていますか?

where abc.Id = "5" 

これは単純な例です:

MyType.Where(Func<TEntity,bool>((entity)=>entity.Id == 5))) 

は、今私は、where句を表す対応する文字列を取得する必要があります。それは論理接続詞でも動作するはずです。

私はexpressiontreeを作成し、自分でそれを解析することができます知っているが、私は、私はあなたが発見し、処理の唯一の目的とExpressionVisitorを作成することができ

+0

ん 私はこの MyType.Where(機能((エンティティ)のようなmethoedました=> entity.Id == 5))) where句を表す対応する文字列を取得する必要があります。 ここでabc.Id = "5" これに対して私は式ツリーを作成し、それを自分で解析することができました。 しかし、すでに存在するものがあるはずだと感じています。 –

+0

ああ、そうです。おそらく、元の質問を編集して、そこに余分な情報を追加することができますか? –

+1

ヒント:-)をお寄せいただきありがとうございます –

答えて

5

を欠けている既存の何か、があるかもしれないと思いますどこで呼びますか?このタスクを非常に扱いやすくします。

例えば、

public class WhereCallVisitor : ExpressionVisitor 
{ 
    protected override Expression VisitMethodCall(MethodCallExpression node) 
    { 
     var method = node.Method; 
     if (method.Name == "Where" && method.DeclaringType == typeof(Queryable)) 
     { // we are in a Queryable.Where() call 
      ProcessWhereCall(node); 
     } 
     return base.VisitMethodCall(node); 
    } 

    private void ProcessWhereCall(MethodCallExpression whereCall) 
    { 
     // extract the predicate expression 
     var predicateExpr = ((dynamic)whereCall.Arguments[1]).Operand as LambdaExpression; 
     // do stuff with predicateExpr 
    } 
    // p.s., dynamic used here to simplify the extraction 
} 

そして、それを使用する:

var query = from row in table 
      where row.Foo == "Bar" 
      select row.Baz; 
var visitor = new WhereCallVisitor(); 
visitor.Visit(query.Expression); 
+0

私はこの回答で基盤を離れていないことを望みます。私が質問を理解したように、式ツリーがあると、whereを呼び出して述語で何かをしたい(その節を表すSQL文字列を作成する)必要があります。これだけでは答えられませんが、あまりにも多くの問題がなければあなたをそこに連れて行きます。述語式を見つけると、対応するSQL文字列を取得するのは比較的簡単です。 –

+0

あなたの答えをありがとう。私はそれをどのように実装する予定ですか?しかし、私はそこに何かが存在すると思った。 しかし、それは私がそれを実装しなければならないもののように見えません。 –

関連する問題