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

iqueryable - System.Linq.Expressions.ExpressionVisitor 由于其保护级别而无法访问

我正在尝试按照有关创建 IQueryable LINQ 提供程序的说明进行操作,但是当我按照指示实现继承自的类时,ExpressionVisitor我被告知 ExpressionVisitor 由于其保护级别而无法访问。我错过了一些非常基本的东西吗?

0 投票
1 回答
4175 浏览

linq - ExpressionVisitor.Visit 是什么做?

在有人喊出答案之前,请通读问题。

.NET 4.0 的 ExpressionVisitor 中方法的目的是什么:

我对这个方法的目的的第一个猜测是它会访问nodes参数指定的每棵树中的每个节点,并使用函数的结果重写树elementVisitor

情况似乎并非如此。实际上,这种方法似乎比什么都不做,除非我在这里遗漏了一些东西,我强烈怀疑我是......

我尝试在我的代码中使用此方法,但当事情没有按预期进行时,我反映了该方法并发现:

那么有人会在哪里使用这种方法呢?我在这里想念什么?

谢谢。

0 投票
2 回答
1956 浏览

c# - 将条件表达式解析为字符串

我正在寻找一种将条件表达式解析为字符串的方法。

我能想到的最好的例子是 LINQ-to-SQL。它使用 ExpressionVisitor 来格式化“Where”子句。例子:

这将转化为以下字符串(大约,MSSQL 对我来说不是最新的):

根据我的阅读,这是使用 ExpressionVisitor 类完成的,如本文所述:链接

现在的问题是我不使用 LINQ,但我需要这个特殊的功能。有没有办法解析这样的条件?我愿意用反射、委托、lambda 等做任何事情。

老实说,我不认为这是可能的,但我的大脑有点炸了(阅读:如果这个问题很荒谬,那就太好了),所以我想我不妨试试 S/O。

编辑:最终用法示例:

编辑 2:是的,一个数字可以小于 3 等于 5。告诉你我的大脑被炸了。

0 投票
5 回答
689 浏览

c# - 我们可以从 linq 表达式中删除子句吗?

我想知道是否可以从 linq 表达式/查询运算符中添加/删除 where 子句。

例如:-

是否可以在后期删除 where 表达式?

提前致谢 :)

0 投票
1 回答
700 浏览

c# - 如何在不编译的情况下从现有 LambdaExpression 构建 LambdaExpression

我想组合两个 LambdaExpressions 而不编译它们。

如果我编译它们,这就是它的样子:

这显然不是从提供的参数中获取目标表达式的最快方法。此外,它与不支持 C# 方法调用的查询提供程序(如 LINQ to SQL)不兼容。

从我读过的内容来看,最好的方法似乎是建立一个ExpressionVisitor类。但是,这似乎是一项非常常见的任务。有谁知道提供这种功能的现有开源代码库?ExpressionVisitor如果不是,那么使其尽可能通用的最佳方法是什么?

0 投票
2 回答
663 浏览

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

[更新] 添加更多关于我们想要做什么的细节

0 投票
4 回答
4808 浏览

c# - 如何评估 ExpressionVisitor 中的表达式?

在执行表达式之前,我需要使用 ExpressionVisitor 来分析它。为了我的需要,我需要评估 Divide 表达式的正确部分,但我不知道该怎么做。这是我拥有的示例代码:

假设我有这个代码来评估:

在 VisitBinary 函数中,我将收到一个节点,该节点将包含除法操作的左右部分。我的问题是,我如何评估我将在正确的操作部分中获得的价值?

0 投票
1 回答
951 浏览

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 中。

我希望我的问题是可以理解的。感谢您的任何见解!

0 投票
1 回答
291 浏览

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 将通过网络调用服务层,并在调用中使用fromto作为参数。然后 Convert 会将数据转换为我的类型。

TRaw 是服务将返回的类型,TData 是前端内的类型和 IQueryable 内的类型,TRangei 是范围类型。

所以这是可能的:

...或等效的 OData。

这就是 ExpressionVisitor 的用武之地。我需要使用 ExpressionVisitor 来查找 From 和 To 日期。

我看过一些教程并提出了一些想法。我遇到的问题是我不知道如何对 ExpressionVisitor 进行单元测试。我将如何创建一个等效于 Queryable 扩展方法创建的表达式?

0 投票
2 回答
1104 浏览

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)).