将表达式树解析为Sqlstring - 不重新发明轮子

时间:2011-07-06 06:29:47

标签: sql string linq parsing expression-trees

我需要解析表达式树以获取sql where子句。

.NET FX中是否有任何类或任何已具备此功能的第三方库?

我的意思是Linq2SQL,EntityFramework,所有人都必须这样做,所以有人知道,如果有什么东西可以重复使用而不是重新发明轮子吗?

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

现在我需要获取表示where子句的相应字符串:

 where abc.Id = "5" 

这只是一个简单的例子。它也应该与逻辑连词一起使用。

我知道我可以创建表达式树并自己解析它,但我认为可能存在已经存在的东西,我不知道

1 个答案:

答案 0 :(得分:5)

您可以创建ExpressionVisitor,其唯一目的是查找和处理where调用。使这项任务非常容易处理。

如,

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