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

标签 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" 

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

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

最佳答案

你可以创建一个 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);

关于sql - 将表达式树解析为 Sqlstring - 不是重新发明轮子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6592382/

相关文章:

php - 1064 mySQL 错误 : AS salary ON resume. jobsalaryrange = salary.id ' 在第 6 行

sql - MySQL Nested Sets - 如何找到节点的父节点?

JavaScript 正则表达式(替换)如果在其他单词之后没有单词

c# - LINQ to Objects,如何就地更新列表中的项目?

c# - 如何在 microsoft.clearscript.v8 中的 jsondata 中使用 linq

java - 我正在尝试更新表的值 SQL 在 Java 中出现错误

SQL:计算日复一日的重复用户百分比

string - 如何在 Rust 中创建静态字符串?

javascript - 获取当前现代 Javascript 中字符串的最后一个字符,允许使用代理对(两个代码单元)的星体字符,例如表情符号

c# - 按索引从 IQueryable<anonymous> 列表中获取元素