问题标签 [expressionvisitor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1543 浏览

c# - 由于关闭而将实际值包装到 DisplayClass 中时获取 ConstantExpression.Value

下面是我的问题的简单演示代码。

TestParam方法导致VisitConstant在两个不同的路径上调用:

1 TestParam .-> Search->VisitConstant

在这个执行路径中,传递给Search方法的常量表达式 (1L) 是一个实常量值。到这里,一切正常,assert按预期成功。当VisitConstant通过第一个路径调用时node.Value.GetType()isInt64和它的.Valueis 1L

2 TestParam .-> GetStudent-> Search->VisitConstant

在这个执行路径常量表达式 (id: 1L) 中,GetStudent作为参数并传递给Search闭包内的方法。

问题

问题出在第二条执行路径上。当VisitConstant通过第二条路径调用node.Value.GetType()MyProject.Tests.ExpressionTests+<>c__DisplayClass0,该类有一个名为id(与GetStudent方法的参数相同)的公共字段,其值为1L.

问题

如何id在第二条路径中获得价值?我知道闭包,什么是 aDisplayClass以及为什么在编译时创建它等。我只对获取它的字段值感兴趣。我能想到的一件事是,通过反射。像下面这样的东西,但它看起来并不整洁。

奖金问题

在使用获取id值的代码时,我更改了VisitConstant如下方法(但这不会解决我的问题)并得到一个异常说“'object'不包含'id'的定义”

在此处输入图像描述

奖金问题

由于动态是在运行时解析并DisplayClass在编译时创建的,为什么我们不能使用 访问它的字段dynamic?虽然下面的代码可以工作,但我希望该代码也可以工作。

0 投票
2 回答
316 浏览

c# - 参数为复杂对象时的参数替换

我正在尝试创建一个AndAlso将在查询Where方法中使用的动态过滤器:LINQ-to-EF

filterExpression编译的 lambda在哪里

到目前为止,我已经实现了一个带有一些奇特用法的循环来检查只有一个、两个或多个查询的情况。

然后我设置了一个ParameterReplacer以确保我的表达式参数的所有迭代都获得相同的引用:

它是由:

ParameterReplacer课程由JonSkeet提供)

运行时出现ParameterReplacer以下错误:

其中FileColumnRecords定义为:

并且FileColumnValues作为:

0 投票
1 回答
109 浏览

c# - If Participating in Queryable c# join

Looking for ways to find participation in queryable Joins...

Basically, I want to check if model class X is used in join operations in Queryable statements. Using David Fowl's QueryInterceptor I can put an expression visitor on an IQueryable. Then check for Lambda expressions (looks like joins are represented with them generally) for parameters with a type of class X. The visitor can toggle a flag for a hit.

Other ways? Again, I am only interested in if class X is involved in joins.

0 投票
1 回答
493 浏览

linq - 如何使用 ExpressionVisitor 从 ExpressionTree 中删除 OrderBy 表达式?

Azure 表存储 linq 提供程序不支持 Orderby 语句我有一个类似的表达式

我正在尝试.OrderBy(user => user.UserName)从表达式树中删除

我还希望访问者从以下表达式中删除 orderby 语句

会变成

0 投票
1 回答
1147 浏览

c# - System.Linq.Expressions.ExpressionVisitor.VisitExtension 和 System.Linq.Expressions.ExpressionType.Extension 有什么用?

System.Linq.Expressions.ExpressionVisitor有一个名为的方法,除了调用被访问的方法VisitExtension外,它似乎什么也不做。VisitChildrenExpression

我明白它的VisitChildren作用。我也明白这个虚拟实现可以并且可能意味着被覆盖。因此,我从MSDN 上的方法文档中收集了一些信息,并简要说明了这一点:

访问扩展表达式的子级。这可以被覆盖以访问或重写特定的扩展节点。如果它没有被覆盖,这个方法将调用 VisitChildren,这让节点有机会遍历它的子节点。默认情况下,VisitChildren 将尝试减少节点。

我觉得这个解释没有帮助。具体来说,让我无法理解的短语是“或重写特定的扩展节点”。

我理解它的其余部分,这与将表达式简化或分解为子表达式有关。

在同一个命名空间中还有一个名为 的枚举ExpressionType,我非常了解它的目的。但是在它的所有成员中,有一个名为Extension我无法映射到我目前知道的任何语法标记的成员。

例中的文档也非常简洁。它描述的值Extension如下:

扩展表达式。

很明显,这两者 -ExpressionType.ExtensionExpressionVisitor.VisitExtension- 是相关的。

但是什么是扩展?当然,正如显而易见的那样,扩展方法在这种情况下没有地位。表达式扩展在这里指的是哪个语法工件?

0 投票
0 回答
107 浏览

c# - 如何使用 ExpressionVisitor 更改表达式,添加更多属性?

我有一个具有两个属性的表达式,我需要在运行时更改此表达式以添加更多项目。

在将 query1 传递给访问者之后,我希望返回给我一个表达式:

结果时BarCode,需要返回一个默认值,例如:string.Empty

我该怎么做?我在互联网上搜索了任何示例,但一无所获。

0 投票
1 回答
912 浏览

c# - 从现有表达式在父对象上创建表达式树以进行 c# mongodb 驱动程序解析

我有这样的课:

我还有另一个通用类,例如:

例如,我有一个这样的表达式:

如何将此表达式转换为:

编辑 :

我认为我的问题还不够完善,我想要这样的方法:

编辑 :

我必须创建一个新的树表达式,然后由 c# mongodb 驱动程序解析。我不能在表达式树上使用 Invoke an other Compile 方法。

我想我必须使用ExpressionVisitor但我不知道如何......

0 投票
2 回答
345 浏览

c# - 为什么不抛出表达式树中最里面的异常?

我一直在尝试创建一个自定义ExpressionVisitor,该自定义会生成一个(可选)NullReferenceException在第一个null值上抛出 a 的表达式。表达式的DebugView对我来说看起来不错,但它不能作为 exptecte (由我)工作。我以为它会首先抛出

因为测试变量是null但是这个变量被抛出

我不明白为什么它会向后执行语句。它不应该If先执行最里面的吗?

调试视图:

我的完整测试代码:

0 投票
1 回答
305 浏览

c# - 按类型从表达式中提取所有条件

给定一个Expression<Func<TEntity, bool>>沿着

我正在尝试按类型提取列表属性条件,即

到目前为止,我已经创建了一个方法ExpressionVisitor并将该方法标识VisitBinary为我想要插入的方法以获取我的信息。

我仍然不知所措

  • 如何确定BinaryExpression我正在查看的是否代表终端语句(在某种意义上,我不需要查看更多嵌套表达式)
  • 如何确定所BinaryExpression关心的实体类型
  • 我是否需要覆盖任何其他ExpressionVisitor方法来涵盖我尚未考虑的情况。
0 投票
2 回答
755 浏览

c# - ExpressionVisitor 没有调用它的 VisitMethodCall

我正在关注MSDN 上的一个示例系列,用于创建 LINQ 提供程序并且已经碰壁了。

我期望当我编写以下测试时,下面ExpressionVisitor的源代码中的子类会VisitMethodCall被调用。

相反,会发生该VisitConstant方法被调用。我认为这是因为当Provider实例化时,它分配了它的Expression属性 a ConstantExpression。我不确定我是否做错了什么,或者 MSDN 上的指南是否存在问题,阻止我获取包含Where方法调用的表达式。

IQueryable<T>这是我拥有的和IQueryProvider实现的源代码。

编辑

更新了我的单元测试以实际存储IQueryablefrom .Where,我仍然没有看到我的VisitMethodCall调用。