开发者

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

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜