问题标签 [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 投票
1 回答
99 浏览

c# - C# 表达式访问者,如何否定构建过滤器

我正在为第三方 api 构建我自己的 IQuerable 实现。

此 Api 接受过滤器作为 OR 列表,其中包含相应的 AND 语句和过滤器列表,如下所示:

现在构建这些过滤器很顺利,每当我有一个 or 语句时,我都会将所有当前的过滤器炸开,或者每当我得到和声明时,我都会将它添加到所有的 or 中。这些似乎工作正常,除非现在每当我在多个字段上有一个一元非表达式时,我就会迷路。

说我有:(a and b) or (c and d) 这将变成过滤器:

否定这将导致:(!a or !b) and (!c or !d)

这仍然是可能的,但我想弄清楚的是,如果它被双重否定,我将如何能够恢复它,这将(a and b) or (c and d)再次导致。但我似乎无法弄清楚。也许我应该在将它们变成这些和或列表之前使用不同的中间过滤器结构。我怎么能做到这一点?

0 投票
1 回答
182 浏览

.net - 如何在 LINQ 查询提供程序 (ExpressionVisitor) 中调用函数或属性

我正在创建一个 LINQ 提供程序。查询可能如下所示:

在我的查询提供程序中,我执行一个 ExpressionVisitor,它读取查询并创建 MSSQL 查询。但是当我访问 ExpressionTree 时,我无法找到如何调用 DateTime.Now 属性。

解析表达式树时,我得到表达式转换(日期时间。现在)。我想以某种方式调用该属性。所以我稍后可以将它附加到生成的 sql 查询中。上面我有 C# 语法中的查询,尽管我在 VB.NET 中编写代码。代码如下:

它的作用是当我 Expression.Right.NodeType 是 ExpresionType.Convert 我步入一个帮助类:

当我检查 BinaryExpression 时,我可以在左侧看到 f.Date。如果我将 exp.Right 转换为一元,我可以将其视为 Convert(DateTime.Now)。我需要以某种方式调用 DateTime.Now 属性,以便稍后在 SQL 查询中附加它。像这样:

我只是不知道如何调用该属性:(

更新: 好的,所以我发现用于创建 LINQ 提供程序的msdn 文章有一个帮助程序类的示例,一个部分评估程序,它可以为您完成这项工作。它通过表达式树并评估函数调用等。所以我现在在我的项目中使用该类。它更容易,完成后它会返回表达式树。

0 投票
0 回答
2328 浏览

sql - Entity Framework Core PostgreSQL Linq to SQL Json Field

对不起,我的英语不好

注意:Npgsql 不支持直接使用 EF Core Mapping 的 json 查询

如您所知,PostgreSQL 支持 json 和混合数据。如果你想查询,你可以使用这样的语法

对于我的问题,这里是示例表和示例类

桌子:

这是此表的 C# 类

好的。当我像这样使用 linq 或 lambda 时没问题

生成

但我不能像这样查询名为 FileInfo 字段的 json 区域。

因为 EF 没有任何提供程序用于转换为 sql "file_info->>'FileName'"

我被搜索并找到了这个词

并且还找到了这个文件和答案

如何将表达式树转换为部分 SQL 查询?

https://www.codeproject.com/Articles/22819/How-To-LINQ-To-SQL-Part-III

我相信可以生成 [ file_info->>'FileName' = 'name.ext' ; ] 查询使用此文档。但我无法得到它。

请你给我看一个简单的例子。

0 投票
1 回答
409 浏览

c# - 创建 Where 查询的 LINQ 扩展方法

我正在尝试创建一个可用于 LINQ-to-Object 和 LINQ-to-Entities 的扩展方法,以创建功能Where查询。最终会有更多内容进入它,但首先我遇到了一个问题,只是让方法获取 lambda 列选择并将其用作Contains()调用的基础。我已经能够为 LINQ-to-Objects 做一些事情,但是当我尝试将它用于 LINQ-to-Entities 时,它就出现了问题。

以下是适用于 LINQ-to-Objects 的方法:

如果这是针对实体框架运行的,我会收到一个异常说明

LINQ to Entities 无法识别该方法...

我有一种感觉,这将需要使用ExpressionVisitor,但我无法弄清楚它需要如何连接。有没有人能够做到这一点?

更新:

我认为这不是重复的,因为 xanatos 提供的答案显示了在不使用 ExpressionVisitor 的情况下实现这一目标的直接方法。

0 投票
0 回答
108 浏览

c# - 将 ExpressionVisitor 转换为 DbExpressionVisitor,将参数读取为常量

我目前有一些我在一些 IQueryable 调用中手动使用的 ExpressionVisitor

但我想使用拦截器将它们挂钩到所有查询中,但是我需要将它们转换为 DbExpressionVistors

我想我已经对它们进行了排序,除了一个,它接受一个参数值并将其作为常量输出,以创建基于租户 ID 的唯一查询计划

我遇到的问题是,我似乎无法找到一种方法将 DbParameterReferenceExpression 中的参数值提取为常量值,就像之前的 ExpressionVisitor 代码一样:

有人对此有任何意见或反馈吗?我一直在四处寻找它,但它似乎是我要进入的非常实验性的领域!

编辑: 或者是否可以将我现有的 ExpressionVisitior 与拦截器或 DbExpressionVisitor 结合使用?

0 投票
0 回答
482 浏览

c# - 如何使用 Expression Visitor 修改 MemberBinding 表达式

我正在尝试使用表达式访问者修改 MemberBinding 表达式。但是当我尝试编译修改后的表达式时出现错误:

从范围''引用'EFTest.Views.TestView'类型的'变量'源',但未定义'

我还想提一下,如果我在 VisitMemberBinding 函数中返回 MemberBinding,我不会收到任何错误。我还确保修改后的表达式与原始表达式完全相同。

这项工作的最终目的是阻止 EntityFramework Core 中所有 linq 查询中的特定列。如果您对此有任何建议,请告诉我。

示例代码如下

0 投票
0 回答
231 浏览

antlr - Antlr Cpp templated visitor class

Is there any possibility of templated visitors in AntlrCpp similar to Java implementation? I've a BaseExpression class that I want to return from my visitors but for the sub-rules, I'd like to return ScalarExpression/VectorExpression that derive from BaseExpression. Now, I've to check the type of Any everytime I need to do something specific related to scalar or vector rules. Having a template would eliminate the need for Any and we can directly access the right type of object returned from each visitor method.

0 投票
0 回答
134 浏览

c# - 使用 ExpressionVisitor 如何动态获取 ParameterExpression 表达式的评估值

我有一个表达式,它将表达式作为其参数之一:

在此处输入图像描述

我正在使用 ExpressionVisitor 来获取常量的值,请参阅此 SO 帖子

但如果成员是 memberAccess 类型,我希望能够评估该参数的实际值。在这个例子中,($obj.Name).Length

该示例要检查 int(第一个值)是否大于第二个值(在本例中为表达式)。如果它是一个常量,我知道如何获取它们的值,但我不知道如何动态评估表达式。

我已将整个对象和整个表达式传递给 ExpressionVisitor,以便在需要时可以使用它们来提供帮助。

VisitMember 中的节点值为:

在此处输入图像描述

我可以访问 T 和 TMember。其中 T 是所有被调用的主要对象(具有属性 Age),在这种情况下 TMember 是 int (Age)。

我不确定上面的示例是否朝着正确的方向发展,如果是,我不确定如何完成它。

0 投票
1 回答
91 浏览

c# - 从 FieldInfo 获取 DateTime 值

我正在尝试DateTime通过反射检索一个。该值不在类或静态类中,而是来自lambda expression...

我有这个非常简单的 lambda 表达式:ATest => ATest.MyDate == DateTime.Now

现在,通过ExpressionVisitor我正在尝试获取日期时间值:

如何获取该字段的 DateTime 值?谢谢

0 投票
1 回答
160 浏览

c# - 如何将 C# 表达式转换为自定义嵌套类结构?

我有自定义查询类,它将用于在 lambda 表达式的帮助下构建查询,如下所示

通过ExpressionVisitor基于此参考链接类实现,我能够将翻译后的查询转换为字符串格式,如下所示

(((Name EqualTo "Maulik") AND ((Id EqualTo 2) OR (Age EqualTo 30))) OR ((Id EqualTo 2) AND (Name EqualTo 'Maulik')))

但是,我想将上面的表达式转换为我的自定义嵌套类

其中 Expression 表示:(A > 5 && A < 10)和 Condition 表示最内在的标准A > 5

嵌套的意思是,一个表达式可以有子表达式,也可以有子子表达式等等,每个表达式可以有多个条件。

转换成这种结构的原因是为了处理各种 SQL/NoSQL 提供者,从这种类结构中将为所有不同的提供者创建单独的查询,因此不能完全改变这种类结构。

创建这个类结构是为了维护基于查询的AND和OR条件的括号顺序,因此同级条件可以用单个表达式来俱乐部。

我正在寻找任何可以帮助将表达式转换为嵌套类结构的通用映射。

将表达式转换为自定义嵌套类结构的最佳方法是什么?如果有任何可用的实施示例,请分享。我还找不到任何相关的例子。