开发者

Parsing Expression Tree To Sqlstring - Not Reinventing the wheel

开发者 https://www.devze.com 2023-03-17 19:24 出处:网络
I need to parse an expressiontree to get a sql where clause. Aren\'t there any classes in the .NET FX or any third party library which already have this abilities ?

I need to parse an expressiontree to get a sql where clause.

Aren't there any classes in the .NET FX or any third party library which already have this abilities ?

I mean Linq2SQL, EntityFramework , all of them have to do this, so does anyone know, if there is something that can be reused instead of reinventing the wheel?

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

now i need to get th开发者_StackOverflowe corresponding string representing a where clause:

 where abc.Id = "5" 

this is just an simple example. it should also work with logical conjunctions.

I know I can create the expressiontree and parse it on my own, but i think there could be something already existing, which I'm missing


You could create an ExpressionVisitor with the sole purpose of finding and processing the where calls. Making this task very easy to handle.

e.g.,

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
}

Then to use it:

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号