Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parsing Expression Tree To Sqlstring - Not Reinventing the wheel

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 the 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

like image 545
Boas Enkler Avatar asked Feb 03 '26 14:02

Boas Enkler


1 Answers

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);
like image 63
Jeff Mercado Avatar answered Feb 06 '26 04:02

Jeff Mercado