Tag: expressionvisitor

如何评估ExpressionVisitor中的表达式?

在执行Expression之前,我需要使用ExpressionVisitor来分析它。 根据我的需要,我需要评估Divide表达式的正确部分,但我不知道该怎么做。 这是我的示例代码: internal class RulesChecker : ExpressionVisitor { private readonly object data; public RulesChecker(object data) { this.data = data; } protected override Expression VisitBinary(BinaryExpression node) { if (node.NodeType == ExpressionType.Divide) { var rightExpression = node.Right; // compile the right expression and get his value } return base.VisitBinary(node); } } 假设我有这个代码来评估: Expression<Func> expression = x […]

如何在没有编译的情况下从现有的LambdaExpression构建LambdaExpression

我想结合两个LambdaExpressions而不编译它们。 这就是我编译它们时的样子: public Expression<Func> CreatePredicate( Expression<Func> getMemberExpression, Expression<Func> memberPredicateExpression) { return x => memberPredicateExpression.Compile()(getMemberExpression.Compile()(x)); } 这显然不是从提供的参数中获取目标表达式的最快方法。 此外,它使它与不支持C#方法调用的LINQ to SQL等查询提供程序不兼容。 从我所看到的,似乎最好的方法是构建一个ExpressionVisitor类。 然而,这似乎是一个非常常见的任务。 有没有人知道提供这种function的现有开源代码库? 如果没有,那么接近ExpressionVisitor以使其尽可能通用的最佳方法是什么?

LINQ表达式中不区分大小写的字符串比较

我正在尝试编写一个ExpressionVisitor来包装我的LINQ到对象表达式,以自动使它们的字符串比较不区分大小写,就像它们在LINQ-to-entities中一样。 编辑:我确实想要使用ExpressionVisitor,而不是仅仅在创建它时为我的表达式应用一些自定义扩展或其他一些重要原因:传递给我的ExpressionVisitor的表达式是由ASP.Net Web API ODATA层生成的,所以我无法控制它是如何生成的(即我不能小写它正在搜索的字符串,除非在此ExpressionVisitor中)。 必须支持LINQ to Entities。 不只是扩展。 这是我到目前为止所拥有的。 它在字符串上查找对“Contains”的调用,然后在该表达式内的任何成员访问上调用ToLower。 但是,它不起作用。 如果我在更改后查看表达式,它看起来对我来说是正确的,所以我不确定我可能做错了什么。 public class CaseInsensitiveExpressionVisitor : ExpressionVisitor { protected override Expression VisitMember(MemberExpression node) { if (insideContains) { if (node.Type == typeof (String)) { var methodInfo = typeof (String).GetMethod(“ToLower”, new Type[] {}); var expression = Expression.Call(node, methodInfo); return expression; } } return base.VisitMember(node); } private […]