问题标签 [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.
expressionvisitor - ExpressionVisitor.VisitParameter,为什么每个参数打印2次?
为什么 VisitParameter 将每个参数打印 2 次?
结果:
X
是的
X
是的
c# - 将 ParameterExpression 解析为实际的 Expression
我编写了一个 LINQ-Provider,它运行良好,但有一个例外。它将 LINQ 查询转换为 ODATA URL 标准。
如果我有以下 LINQ 语句:
当我用表达式访问者访问表达式树时,我会得到一个表达式部分(OrderByDescending),它的类型是ParameterExpression。
我现在的问题是:如何获得选定的 x.Name.ToLower() 表达式?这样我就可以将 orderBy 语句翻译为
// 编辑:换句话说:我有一个 ParameterExpression {x => x}。我希望将此表达式解析为 {x => x.Name.ToLower()}
c# - C# ExpressionVisitor.VisitBinary
来自:如何:修改表达式树(C# 和 Visual Basic)
http://msdn.microsoft.com/en-us/library/bb546136.aspx
如果我对这种方法的目的及其工作方式有误,请纠正我。谢谢你。
如果我有一个现有的表达式,Expresstion Visitor 会将每个 BinaryExpression 发送到这个方法,所以这两行,据我了解是浪费:
因为这两行做同样的事情,将负责将每个 BinaryExpression 发送到此方法。我对吗?
Expression.MakeBinary 的目的是将 BinaryExpression 更新为新的。那么为什么不使用这个方法:b.Update??
最后一件事,这个方法是否会将这个表达式上的每个 AndAlso 替换为 OrElse ?
提前感谢您的时间。
c# - 转换 ac# 表达式
我正在尝试转换 ac# 表达式。这是我正在寻找的示例结果。兑换:
对此:
正如您在下面的代码中看到的那样,FieldID 实际上是通过类上的属性的反射来获取的。我现在得到的错误是从 Convert 返回的错误是“'System.Int32' 类型的表达式不能用于返回类型'System.Boolean'”
我碰壁了,想也许有人可以看到我在这里做错了什么。这是我的代码:
linq - 具有多种类型的 ExpressionVisitor
我正在使用 ExpressionVisitor 将类型转换为Expression<Func<T1,bool>>
,Expression<Func<T2,bool>>
并且效果很好。但我注意到,如果表达式包含其他类型,因为导航属性 ExpressionVisitor 会导致异常..
假设我有两个不同的课程。
这两个类具有完全相等的 DTO,其后缀为“Info”。所以我有四节课Brand, BrandInfo, Model, ModelInfo
现在我得到了如下表达式。
这个表达式可以用Expression<Func<BrandInfo,bool>>
成功转换ExpressionVisitor
。但是,如果我想转换如下表达式,则会生成异常。
因为ExpressionVisitor
仅适用于Brand
并且BrandInfo
class 和Brand
class 包含IEnumerable<Model>
属性 as Models
,但目标类 BrandInfo 包含IEnumerable<ModelInfo>
属性 as Models
。所以当ExpressionVisitor
试图绑定Models
属性时,它会抛出异常。
我找不到转换包含多种类型的表达式的方法。
这是我用来转换的代码
c# - ExpressionVisitor.Visit 在数据服务查询访问者中引发“必须是可简化节点”错误
我的 WCF 数据服务的存储库模式实现存在问题。总而言之,我试图在客户端应用程序中使用存储库模式,该模式将可插入模型用于所需的存储库。根本问题是我的存储库接口 IRepository 只能知道它存储的项目的接口类型变体。这是为了将客户端应用程序从订单的数据服务实现中抽象出来,例如
通常,在涉及数据服务之前,此概念可以正常工作。我目前正在使用 NuGet 的 Data Services v5.4。如果我在我的存储库上执行像 ToList() 这样简单的操作,一切正常,翻译会将结果转换为来自 OData 服务的订单列表。但是,如果我尝试执行 orderby,查询表达式会变得更加复杂,并且无法填充返回类型,因为它尝试创建可查询类型的接口变体的实例。即尝试创建 IOrder 的实例而不是 Order。
但是,在客户端级别,如果我使用 Cast 强制类型,那么它可以工作......
显然,这违背了断开连接类型的口头禅,因为我的客户端应用程序必须知道数据服务库中的强类型“订单”,如果我想在将来切换出 OData,我想避免这种情况。
接下来,我偶然发现了 Data Service Client 端 Context 类,它允许您处理解析类型的方法,但在我的情况下,由于某种原因从未调用过解析。
我随后开始查看的是 ExpressionVisitors,我仍然相信它是我摆脱这种混乱的门票,它必须能够将任何 IOrder 参数转换为我的存储库中的 Order 参数,以便查询返回强类型但继续接口类型。
当使用空壳 ExpressionVisitor 实现时,例如
这对于非数据服务查询(例如,可查询的列表之类的东西)很好用,但对于数据服务存储库模式查询,您会收到无用的(至少对我而言)消息“必须是可简化节点”。我猜是表达式树访问者遇到了数据服务查询自定义的节点类型并且不知道如何处理它。但是我认为 ExpressionVisitor 会简单地复制树中的内容,除非被告知做不同的事情?
无论如何,我要问的是,如何通过将此 ExpressionVisitor 与 OData 查询一起使用来替换查询的返回类型?我试图寻找某种现有的数据服务表达式访问者,但找不到。我希望我的客户端数据服务从接口类型查询生成查询,但返回同名的强类型。
c# - LINQ 表达式中不区分大小写的字符串比较
我正在尝试编写一个 ExpressionVisitor 来包装我的 LINQ-to-object 表达式,以自动使其字符串比较不区分大小写,就像它们在 LINQ-to-entities 中一样。
编辑:我绝对想使用 ExpressionVisitor 而不仅仅是在创建表达式时应用一些自定义扩展或其他东西,原因有一个:传递给我的 ExpressionVisitor 的表达式是由 ASP.Net Web API ODATA 层生成的,所以我无法控制它是如何生成的(即我不能小写它正在搜索的字符串,除非在这个 ExpressionVisitor 中)。
必须支持 LINQ to Entities。不仅仅是扩展。
这是我到目前为止所拥有的。它在字符串上查找对“包含”的调用,然后对该表达式内的任何成员访问调用 ToLower。
但是,它不起作用。如果我在更改后查看表达式,它看起来对我来说是正确的,所以我不确定我可能做错了什么。
如果我在 VisitMember 方法的“返回表达式”行上设置断点,然后在“节点”和“表达式”变量上执行“ToString”,断点会被命中两次,这就是两组值的含义:
第一击:
第二击:
我对表达式的了解还不够,无法弄清楚我在这一点上做错了什么。有任何想法吗?
c# - 如何将表达式 x=>!x 重写为 x=>x!=true 和 x=>x 到 x=>x==true
假设我们这样表达:
我需要将上面的表达式(使用表达式访问者重写)转换为这样的表达式:
注意:如果我们有更复杂的表达式,重写器也必须在更一般的情况下工作:
c# - Identify parentheses in lambda expression with ExpressionVisitor in C#
I have a library that converts a lambda expression to an odata filter string using the ExpressionVisitor
class.
For example, the expression o => o.Teste == null && !(o.Date != DateTime.Now)
turns into $filter=Teste eq null and not(Date ne xx/xx/xx)
It works fine. The problem is when I have to group parts of the condition with parentheses (). The parentheses are ignored and it just writes the condition without it.
For example, the expression (o => o.Name != null && o.Name == "Joe") || !(o.Date != DateTime.Now)
turns into $filter=Name ne null and Name eq 'Joe' or not(Date ne xx/xx/xx)
What's weird is that the ExpessionVisitor
doesn't seem to identify the parentheses, it has a NodeType
for not !(expression)
but it doesn't have for (expression)
.
I've been searching for this on Google for two days and I can't seem to find an answer.
Thanks in advance for the Help.
c# - 重写表达式树
我有以下表达式:
并希望将其重写为以下内容:
我尝试使用 Expression Visitor 和以下代码:
但我得到了这个例外:
System.Core.dll 中出现“System.ArgumentException”类型的第一次机会异常
附加信息:“DynamicClass1”类型的表达式不能用于返回类型“System.Linq.Dynamic.DynamicObjectClass”
我想我需要覆盖 VisitLambda,但我没有确切的想法!谁能帮我吗?