Разбор дерева выражений в Sqlstring - не изобретать колесо - PullRequest
3 голосов
/ 06 июля 2011

Мне нужно проанализировать дерево выражений, чтобы получить предложение sql where.

Нет ли классов .NET FX или какой-либо сторонней библиотеки, у которых уже есть эти способности?

Я имею в виду Linq2SQL, EntityFramework, все они должны это делать, так кто-нибудь знает, если есть что-то, что можно использовать повторно, а не изобретать велосипед?

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

Теперь мне нужно получить соответствующую строкупредставляющий предложение where:

 where abc.Id = "5" 

это просто простой пример.он также должен работать с логическими соединениями.

Я знаю, что могу создать дерево выражений и разобрать его самостоятельно, но я думаю, что может быть что-то уже существующее, чего мне не хватает

1 Ответ

5 голосов
/ 10 июля 2011

Вы можете создать ExpressionVisitor с единственной целью поиска и обработки вызовов. Делая эту задачу очень легко справиться.

например.,

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