问题标签 [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.
iqueryable - System.Linq.Expressions.ExpressionVisitor 由于其保护级别而无法访问
我正在尝试按照有关创建 IQueryable LINQ 提供程序的说明进行操作,但是当我按照指示实现继承自的类时,ExpressionVisitor
我被告知 ExpressionVisitor 由于其保护级别而无法访问。我错过了一些非常基本的东西吗?
linq - ExpressionVisitor.Visit 是什么做?
在有人喊出答案之前,请通读问题。
.NET 4.0 的 ExpressionVisitor 中方法的目的是什么:
我对这个方法的目的的第一个猜测是它会访问nodes
参数指定的每棵树中的每个节点,并使用函数的结果重写树elementVisitor
。
情况似乎并非如此。实际上,这种方法似乎比什么都不做,除非我在这里遗漏了一些东西,我强烈怀疑我是......
我尝试在我的代码中使用此方法,但当事情没有按预期进行时,我反映了该方法并发现:
那么有人会在哪里使用这种方法呢?我在这里想念什么?
谢谢。
c# - 将条件表达式解析为字符串
我正在寻找一种将条件表达式解析为字符串的方法。
我能想到的最好的例子是 LINQ-to-SQL。它使用 ExpressionVisitor 来格式化“Where”子句。例子:
这将转化为以下字符串(大约,MSSQL 对我来说不是最新的):
根据我的阅读,这是使用 ExpressionVisitor 类完成的,如本文所述:链接
现在的问题是我不使用 LINQ,但我需要这个特殊的功能。有没有办法解析这样的条件?我愿意用反射、委托、lambda 等做任何事情。
老实说,我不认为这是可能的,但我的大脑有点炸了(阅读:如果这个问题很荒谬,那就太好了),所以我想我不妨试试 S/O。
编辑:最终用法示例:
编辑 2:是的,一个数字可以小于 3 等于 5。告诉你我的大脑被炸了。
c# - 我们可以从 linq 表达式中删除子句吗?
我想知道是否可以从 linq 表达式/查询运算符中添加/删除 where 子句。
例如:-
是否可以在后期删除 where 表达式?
提前致谢 :)
c# - 如何在不编译的情况下从现有 LambdaExpression 构建 LambdaExpression
我想组合两个 LambdaExpressions 而不编译它们。
如果我编译它们,这就是它的样子:
这显然不是从提供的参数中获取目标表达式的最快方法。此外,它与不支持 C# 方法调用的查询提供程序(如 LINQ to SQL)不兼容。
从我读过的内容来看,最好的方法似乎是建立一个ExpressionVisitor
类。但是,这似乎是一项非常常见的任务。有谁知道提供这种功能的现有开源代码库?ExpressionVisitor
如果不是,那么使其尽可能通用的最佳方法是什么?
c# - 访问 IEnumerable孩子们
这是我们想要做的。
我们有来自数据库的数据,我们需要对其进行格式化以制作报告,包括一些计算(总和、平均值和字段到字段的计算(例如:xa / xb))。
限制之一是,例如,如果总和中的一个数据为空、-1 或-2,我们必须停止计算并显示“-”。由于我们要生成许多报表,每个报表具有相同的逻辑和许多计算,因此我们希望集中这个逻辑。目前,我们生成的代码允许我们检查字段到字段的计算(例如 xa / xb),但不能让我们检查组总数(例如:xb / SUM(xa))
测试用例
规则
- 如果计算中使用的值之一是 -1、-2 或 null,则不应进行计算。在这种情况下,如果找到 -1 或 null,则返回“-”,如果找到 -2,则返回“C”
- 如果您在计算中有多个“错误值”,则需要尊重这样定义的优先级:null -> -1 -> -2。此优先级与计算中值的级别无关
测试
简单计算
复数
到目前为止我们所做的
这里是我们必须处理简单计算的代码,基于这个线程:
如何提取 Expression<Func<T, TResult>> 查询中使用的属性并测试它们的值?
我们创建了一个执行计算并将结果作为字符串返回的强类型类。但是如果表达式的任何部分等于一个特殊值,计算器就必须返回一个特殊字符。
它适用于一个简单的案例,比如这个:
但我需要能够执行更复杂的事情,例如:
当我们开始封装或数据时,IEnurmarable<>
我们得到一个错误:
对象与目标类型不匹配
据我们了解,这是因为 Sub-Expressiony => y.UnitesDisponibles
被应用于IEnumerable
而不是Rapport1Data
.
如果有一天我们有复杂的表达式,我们如何修复它以确保它是完全递归的:
我们建立的课程
和自定义 ExpressionVisitor
[更新] 添加更多关于我们想要做什么的细节
c# - 如何评估 ExpressionVisitor 中的表达式?
在执行表达式之前,我需要使用 ExpressionVisitor 来分析它。为了我的需要,我需要评估 Divide 表达式的正确部分,但我不知道该怎么做。这是我拥有的示例代码:
假设我有这个代码来评估:
在 VisitBinary 函数中,我将收到一个节点,该节点将包含除法操作的左右部分。我的问题是,我如何评估我将在正确的操作部分中获得的价值?
entity-framework - 如何动态绑定实体框架中替换表达式节点中的参数
我正在尝试Utility.GetString(MyEntity.SomePropertyWithRelatedEntity)=="abc"
用表达式访问者替换(简化)之类的函数调用,例如p => p.SubRelatedEntities.FirstOrDefault(sre => sre.SomeFlag==true).SomePropertyWithRelatedEntity
.
这意味着,数据模型如下: MyEntity -> RelatedEntity -> SubRelatedEntity
我正在尝试SubRelatedEntity
根据 中的一些规则从 中返回一个字符串值RelatedEntity
,因此我不必在每次使用中重新编写/复制/粘贴整个过滤规则;这就是为什么我放入一个“调用签名”,所以我的表达式访问者可以识别它并将假调用替换Utility.GetString
为一些复杂的 lambda 表达式。
我的表达式访问者包含以下内容:
现在,问题是,当调用注入的 lambda 表达式时,“sre”参数没有绑定。经过大量研究,我看到 lambda 参数应该替换为另一个表达式访问者,特别是搜索新参数并用旧参数替换它们。然而,在我的情况下,我没有“旧参数”——我有一个表达式MyEntity.SomePropertyWithRelatedEntity
(例如,一个填充了相关实体的属性),我需要以某种方式将其插入到生成的 lambda 中。
我希望我的问题是可以理解的。感谢您的任何见解!
c# - 您将如何对 ExpressionVisitor 进行单元测试?
我在企业环境中工作,我们的前端(客户端和 Web)没有直接的数据库访问权限,而是通过网络与服务通信。针对外部可用的 ASP.Net Web API 的概念验证工作已经开始,我们正在考虑尝试使用 IQueryable 的实现来使用 OData。问题是 Web API 将是另一个“前端”,它访问一个网络跳远的服务层,这意味着我们必须编写自己的 IQueryable 实现。
一个 IQueryable 实现是我所说的 RangeQueryable,它是抽象的并采用三个通用参数;TRaw,TData,TRange。这将是一个IQueryable<TData>
在前面的代码行中,RawData 是 TRaw,ConvertedData 是 TData,DateTime 是 TRange。
RangeQueryable 也有两个抽象方法。
GetData 将通过网络调用服务层,并在调用中使用from
和to
作为参数。然后 Convert 会将数据转换为我的类型。
TRaw 是服务将返回的类型,TData 是前端内的类型和 IQueryable 内的类型,TRangei 是范围类型。
所以这是可能的:
...或等效的 OData。
这就是 ExpressionVisitor 的用武之地。我需要使用 ExpressionVisitor 来查找 From 和 To 日期。
我看过一些教程并提出了一些想法。我遇到的问题是我不知道如何对 ExpressionVisitor 进行单元测试。我将如何创建一个等效于 Queryable 扩展方法创建的表达式?
linq - ExpressionVisitor 软删除
我们在使用实体框架实现软删除功能时遇到了一些问题。这个想法是使用一个知道 EF 上下文的存储库。在存储库级别上,我们实现了一个插件系统,只要对存储库执行操作,就会执行这些插件。例如,当我们调用Repository.GetQuery<Relation>()
插件时,就会执行。其中一个插件是 a LogicalDeletePlugin
,这个插件应该Where(x => x.IsDeleted)
向 select 中的每个表添加一个语句。IsDeleted
想法是使用ExpressionVisitor
访问 linq 表达式并找到所有“表”选择语句并添加IsDeleted
条件来实现此插件。
为了澄清问题/问题,我将使用一些代码示例来解释这个问题。
上面的 c# 代码将产生以下 SQL 代码:
正如您在生成的 SQL 查询中看到的那样,IsDeleted
语句被添加到TestWorks = x.Bonus.Where(y => !y.IsDeleted)
“选择”代码中。这TestVisitor
就是目前正在做的事情。但现在的问题是我们如何在其他选择上也实现这一点,而x => !x.IsDeleted
不是在Test = x.Bonus
部分上添加。
ExpressionVisitor 是完成此任务的正确方法还是我应该使用其他解决方案?感谢所有帮助!如果解释不够清楚,请告诉我,我会尝试提供一些额外的信息!
编辑:
以上是我添加到 ExpressionVisitor 中的内容。现在,当我取消注释返回 Expression.MamkeMemberaccess 代码时,会引发异常,因为它不需要 MemberExpression 或其他东西。
以下是我想出的解决方案:
QueryConditional 是一个持有类型为 Expression 的类Expression<Func<T, bool>>
。
InjectconditionVisitor 可以与 InterceptWith(QueryInterceptor NuGet 包)结合使用,例如query.InterceptWith(new InjectConditionVisitor(new QueryConditional(x => x.Deleted == true))
.