问题标签 [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 回答
5171 浏览

asp.net-web-api - OData:使用 ExpressionVisitor 进行不区分大小写的比较

例如,我有这样的 OData 查询:

  • /供应商?$filter=地址/城市 eq 'city'
  • /供应商?$filter=contains(地址/城市,'城市')
  • /供应商?$filter=endswith(地址/城市,'城市')

...

和地址/城市只有“城市”。我仍然希望查询返回该记录。

我已经读过这篇文章,但它似乎只是针对包含函数的地址。我可以轻松修复其他功能,但 eq 更难。为了使其更简单,我正在考虑通过执行此 .ToString().ToUpper() 将所有字符串 const 替换为大写。

我遇到了问题,因为我无法真正访问该值。

如何将值直接修改为大写或添加对 ToString 和 ToUpper 的调用?

0 投票
2 回答
117 浏览

linq - 使用 ExpressionVisitor 将 'obj == value' 更改为 'obj.Equals(value)'

我正在尝试将一个对象与一个随机值(可能是一个 ID)和 ObjectKey 甚至同一个对象进行比较。简而言之,我想将一个对象与任何东西进行比较,而不仅仅是同一类型。

为此,我覆盖了对象的 Equals() 和 GetHashCode(),它按预期工作。但是我注意到当我通过 'obj == value' 搜索时,Linq 不会调用这些方法。

如果我将查询更改为 'obj.Equals(value)',则 Equals() 方法将被调用。但这不是我需要的。

此外,我尝试重载 '==' 和 '!=' 运算符,但是当我通过接口搜索时,这些重载不会被调用。

最后,我不能只手动更改所有查询,因为将来有人可能会在任何地方使用“==”,从而破坏代码。

所以我来到了ExpressionVisitor。我注意到我可以为我的 Linq 查询重写表达式,但我有点无能为力。我尝试了一些我发现的例子,但我遇到了一些错误。

最后,这是我通过 ExpressionVisitor 需要的:

替换这个: var objects = ctx.Where(obj => obj == value);

为此: var objects = ctx.Where(obj => obj.Equals(value));

可能吗?

0 投票
1 回答
340 浏览

c# - 使用 ExpressionVisitor 停止遍历

我正在使用ExpressionVisitor解析表达式树来确定它是否包含指定的参数。找到参数后,继续遍历就没有意义了。

有没有什么办法可以阻止访问者模式的遍历,更具体地说是ExpressionVisitor.NET中的遍历?

这就是我到目前为止所拥有的,并且按预期工作。但是,一旦布尔标志设置为 true,就该算法而言,停止遍历是有意义的。

0 投票
2 回答
3689 浏览

c# - 替换 lambda 表达式中的参数类型

我正在尝试将 lambda 表达式中的参数类型从一种类型替换为另一种类型。

我在 stackoverflow 上找到了其他答案,即这个答案,但我没有运气。

想象一下,您有一个域对象和一个可以从中检索域对象的存储库。

但是存储库必须处理自己的数据传输对象,然后映射并返回域对象:

ColorDto.cs

域颜色.cs

存储库.cs

如您所见,这将不起作用,因为谓词用于域模型,并且存储库中的 Collection 是数据传输对象的集合。

我曾尝试使用 anExpressionVisitor来执行此操作,但无法弄清楚如何在ParameterExpression不引发异常的情况下更改类型,例如:

测试场景

最后是例外:

System.ArgumentException:没有为类型“ColourDto”定义属性“System.String Name”

希望有人可以提供帮助。

编辑:这是一个dotnetfiddle

还是不行。

编辑:这是一个工作dotnetfiddle

谢谢伊莱·阿贝尔

0 投票
1 回答
134 浏览

c# - 忽略表达式访问者或 IDbCommandTreeInterceptor

对于需要软删除的数据库,我们有一个IsActive位列。为 false 时,表示该记录已被标记为已删除。

在 99% 的情况下,查询应该只包含IsActive设置为 true 的记录。在 Entity Framework 6 中,我们使用自定义DefaultExpressionVisitor(通过IDbCommandTreeInterceptor)在表中存在列时自动进行此检查。

但是,在极少数情况下,需要覆盖此行为。有没有办法为 IQueryable 编写扩展方法或表达式访问者或命令树拦截器可以检查的 DbContext 上的设置?

我希望做类似的事情

或者

影响上述行为,否则会在执行此操作时发生:

如果可能的话,我更喜欢扩展方法路线。

0 投票
4 回答
11931 浏览

c# - 为什么要使用 ExpressionVisitor?

我从 MSDN 的文章中了解到如何:修改表达式树ExpressionVisitor应该做什么。它应该修改表达式。

然而,他们的例子非常不切实际,所以我想知道为什么我需要它?您能否列举一些修改表达式树有意义的真实案例?或者,为什么必须对其进行修改?从什么到什么?

它还有许多用于访问各种表达式的重载。我怎么知道什么时候应该使用它们以及它们应该返回什么?另一方面,我看到人们使用VisitParameter和返回另一个正在返回。base.VisitParameter(node)Expression.Parameter(..)

0 投票
1 回答
448 浏览

c# - 在 Expression.Block 中查找和删除参数声明

我知道如何用 ExpressionVisitor 替换参数,但我想知道是否有办法从 Expression.Block 中删除参数。

理想情况下,我应该爬取整个表达式树,并在每次在块内声明参数时删除它。

知道如何使用 ExpressionVisitor 做到这一点吗?

0 投票
1 回答
803 浏览

c# - 用复杂的表达式替换表达式树中的参数值

我正在使用以下方法将 ParameterExpression 替换为另一个:

我这样使用它:

如您所见,为了在此刻替换参数,我需要声明并分配一个新的临时 ParameterExpression。

我想知道是否有办法避免这项工作并将 ParameterExpression 直接替换为提供值 ( valueGetter) 的表达式。

这样的事情要清楚:

0 投票
1 回答
226 浏览

c# - 尝试将 LOX 语言实现从 Crafting Interpreter 的书中移植到 C# 时出现泛型问题

我最近发现了语言错误,作为学习过程的一部分,我开始通过 Bob Nystrom 的Crafting Interpreters一书,并尝试在 C# 中重新创建 JLOX 语言解释器。

JLOX 中的“J”是指本书中使用 Java 实现的示例代码。

在本书的“使用树”和“A(不是非常)漂亮的打印机”部分中,Bob 介绍了访问者模式作为“表达式问题”的解决方案。

我试图将 Java 代码翻译成 C#,但现在被以下编译器错误难住了:

“ASTPrinter.VisitBinaryExpr(Expression.Binary):找不到合适的方法来覆盖” (点击查看图片)

两个相关的代码文件是:

表达式.cs

使用系统;

ASTPrinter.cs

我不知道如何解决的错误在ASTPrinter.cs的这一行:

覆盖公共字符串 VisitBinaryExpr(Expression.Binary 表达式)

Visual Studio 编辑器报告的错误文本是:

错误 CS0115 'ASTPrinter.VisitBinaryExpr(Expression.Binary)':找不到合适的方法来覆盖

我想我只是对 C# 泛型返回类型知之甚少。

我一直在四处寻找有关泛型返回类型的信息,但到目前为止,我还没有找到一个清楚的例子来说明它如何与抽象接口的具体实现进行交互。或者,这可能是 C# 和 Java 的泛型功能差异太大而无法直接翻译实现的一个领域。

任何意见,将不胜感激。

0 投票
1 回答
360 浏览

c# - 使用 ExpressionVisitor 创建算术公式

我正在尝试通过模型列中的实体框架 lambda 创建一个动态公式

我正在考虑使用表达式访问者来修改结果

但不确定如何构造一个表达式,该表达式可以从字符串参数({A}+{B}({C}))中对列执行算术函数,其中 A、B 和 C 来自 TableTest 并将结果放在输出模型.结果。我在使用表达式访问者的正确道路上吗?

任何帮助,将不胜感激。