问题标签 [expression-trees]

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 回答
2083 浏览

c# - 父导航属性的 C# 表达式树参数

如何为 1 到 * 导航属性的父端创建 ParameterExpression?

以下适用于子实体:

在 TParent 上尝试类似的操作会产生源自上下文的查询,而不是作为子属性的查询。

等效的 lambda 是这样的:

为清楚起见进行编辑:

我使用以下内容从属性创建成员表达式:

所以看起来我应该在这种情况下使用 MemberExpression 而不是 ParameterExpression 。

0 投票
3 回答
2653 浏览

c# - 如何组合两个成员表达式树?

我正在尝试将以下表达式组合成一个表达式:item => item.sub,sub => sub.key 成为 item => item.sub.key。我需要这样做,以便我可以创建一个 OrderBy 方法,该方法将项目选择器与键选择器分开。这可以使用 OrderBy 上的重载之一并提供 来完成IComparer<T>,但它不会转换为 SQL。

以下是一个方法签名,以进一步阐明我想要实现的目标,以及一个不起作用但应该说明这一点的实现。

这将被称为:

这可能吗?有没有更好的办法?我想要一个以这种方式工作的 OrderBy 方法的原因是支持适用于许多实体的复杂键选择表达式,尽管它们以不同的方式公开。此外,我知道一种使用深层属性的字符串表示来执行此操作的方法,但我试图保持它的强类型。

0 投票
1 回答
3978 浏览

c# - C#,Linq2Sql:是否可以将两个可查询对象合并为一个?

我有一个可查询的地方,我使用了各种WhereWhereBetween语句将集合缩小到某个集合。现在我需要添加一种Where || WhereBetween. 换句话说,我不能像到目前为止那样将它们链接在一起,因为这将作为 And 起作用。那么,我该怎么做呢?

我看到两种可能性:

  1. 从我拥有的一个中创建两个可查询Where,一个使用,一个使用WhereBetween. 然后将它们连接起来。不知道这是否可能?另外,虽然不是在我的特定情况下,但您很可能会以重复结束...
  2. 以某种方式Where表达式和在 中创建的表达式WhereBetween与某种 Or 合并。

第一个,如前所述,我不确定是否可能。如果是这样,我不太确定这是一个好方法。

第二,我可以将其视为一种选择,但不能完全确定所有细节。以下是WhereBetween我的另一个问题的方法,我现在使用它并且效果很好:

我在想我可以将它的表达式构建部分提取到一种新方法中。或许是这样的:

然后我可以使用这个新方法来获取表达式而不是可查询的。所以,假设我有WhereBetween(ø => ø.Id, someRange)and 例如ø => ø.SomeValue == null。我怎样才能将这两者与 Or 结合起来?我正在查看方法中Expression.OrElse使用的WhereBetween方法,我认为这可能是我需要的,或者这可能是Expression.Or. 但是我对这个表达的东西很不稳定,所以我不确定在这里选择什么,或者即使我在正确的轨道上:p

有人可以在这里给我一些指示吗?

0 投票
1 回答
880 浏览

c# - 如何在 linq to sql 的表达式树中包含仅评估一次的 InvocationExpression?

我正在尝试手动组合表达式树以实现某种程度的模块化,这似乎暗示我使用标准的 linq 运算符。该代码本质上创建了一个表达式树,它使用一个表达式来决定调用另外两个表达式中的哪一个。其他表达式之一需要一个额外的参数,该参数本身是使用另一个表达式获得的。此参数用于获取多个值,但对于每次访问,检索参数的表达式都会重复。我已经包含了代码和输出以更好地解释:

当我在数据库上运行此查询时,生成的 SQL 如下:

问题是重复的子选择。一个检索“开始”值,而另一个检索“结束”值。如果它们都从单个子选择中检索出来会更好。如何更改表达式树的构造以强制执行此操作?此外,我确实了解执行此查询有更简单的方法,但是它是此处未显示的更大框架的一部分,只能通过能够从大量可重用表达式中手动组装表达式树来实现。

0 投票
4 回答
2096 浏览

c# - 用于遗传编程的 C# 动态树

我有一些公共的用户定义类,它们的成员之间有关系,还有一些具有特定和通用签名的方法。

我希望能够使用 if/then/else、foreach、do/while、变量赋值等基本控制语句来存储和操作这些类(加上 CLR 类)的自定义控制流。

自定义控制流应在运行时创建,然后存储以供以后使用和操作。这个想法是拥有控制流的数据表示,可能以抽象语法树的形式,具有强类型语法,以便能够应用遗传操作。生成的自定义代码必须作为另一个程序的一部分执行。

1)操作遗传操作的首选代码表示形式是什么,然后执行包括我的类在内的代码,

2) 对于上述问题,我应该使用哪些 c# 技术?我知道有相关技术,如反射、新的 c# 3.0 特性(lambda、表达式树)、CodeDom、DLR 库等,但哪种方法或组合最有效。

3)是否有这样的范例或实现可用?

编辑:该平台提供了定义的 c# 自定义类型的数据,包括常量和时间变量。

每时每刻都将规则应用于数据(基本条件或更复杂的功能),并决定采取一些行动。

我希望能够:

在树或图上表示规则并执行流程。

用户通过 UI 工具包创建自定义规则集

对树或图进行重新排列并应用 GP 操作

0 投票
3 回答
1100 浏览

.net - 封装 Linq to SQL 数据访问的最佳方法是什么?

我一直在尝试将对象映射封装在项目数据存储库中。也许 EF 会提供所需的抽象级别,但出于多种原因,我目前正在使用 Linq to SQL。以下代码旨在将数据库中的用户作为 ModUser 对象列表返回,其中 ModUser 是存储库公开的 POCO:

代码将失败,因为我无法调用 MapResource 表达式,因为我试图从另一个表达式中调用它。我设法通过用 u => new ModResource() 替换“MapResource”来解决这个问题,然后使用 ExpressionVisitor 找到这个占位符节点并将其替换为 MapResource 表达式。

当我尝试使用涉及单个属性的表达式(即 UserResource = MapResource)分配 ModUser 的属性时,我也遇到了类似的问题。通过使用 Expression 类上的方法手动组合所需的表达式,我设法解决了第二个问题。

我确实意识到我可以将上面的代码更改为

但是最终生成的 SQL 查询将需要获取 r 的所有属性,而不仅仅是 MapResouce 所需的属性,因为我们现在正在处理一个函数。此外,如果 MapResouce 需要访问 r 上的更多表,这是不可能的,因为它被用作函数而不是表达式。我可以将 DeferredLoadingEnabled 设置为 true,但这会产生大量单独的查询,而不是修改主查询以加入所需的任何表。

有谁知道这些操作是否会在未来的 .NET 版本中变得更容易,或者我是否以错误的方式解决这个问题?我真的很喜欢 Linq 和 Expression 功能,我只是希望我可以使用更具可读性的代码来使用它们。

更新

我想我可能会添加一些示例来说明我如何使表达式更加可组合。它们并不简洁,但它们完成了工作。

那我在这里做什么?请注意,在此版本的 MapUser 中,我没有正确创建 ModResource 对象,我只是创建了一个虚拟版本。然后我调用一个表达式访问者方法来查找虚拟调用并将其替换为我最初想要的那个。对我来说,似乎缺少表达式语法,因为我基本上能够构建我最初想要的表达式树,但我必须实际访问树才能做到这一点。以下是我发现的另一种解决方法:

在第二个示例中,我知道我可以从用户数据中获取资源数据,但我不能“内联”表达式来展示如何执行此操作并将资源数据映射到资源 POCO。但是我可以手动创建一个表达式树,它给出了一个已经映射的资源 POCO 并使用它。然后,我可以创建另一个表达式来显示如何从用户那里获取资源原始数据,并创建一个最终表达式来显示如何将原始资源数据映射到资源 POCO。现在可以想象,我可以将所有这些信息组合到一个表达式树中,以一种“折叠”出资源特定参数的方式,因为我可以从主要用户参数中获取它。这就是上面的代码所做的。

所以我找到了使表达式高度可组合的方法......它只是感觉不干净。

0 投票
9 回答
34520 浏览

c# - 如何创建 LINQ 表达式树以选择匿名类型

我想使用表达式树动态生成以下选择语句:

我已经弄清楚如何生成

但我似乎找不到可以让我在我的选择 lambda 中指定多个属性的构造函数/重载。

0 投票
7 回答
25683 浏览

c# - 假人的表达树?

我是这个场景中的假人。

我试图在谷歌上阅读这些是什么,但我就是不明白。有人可以简单解释一下它们是什么以及它们为什么有用吗?

编辑:我说的是 .Net 中的 LINQ 功能。

0 投票
4 回答
13559 浏览

c# - C#如何转换表达式> 到表达式>

我之前使用过基于 lamdas 的 C# 表达式,但我没有手工编写它们的经验。给定一个Expression<Func<SomeType, bool>> originalPredicate,我想创建一个Expression<Func<OtherType, bool>> translatedPredicate.

在这种情况下 SomeType 和 OtherType 具有相同的字段,但它们不相关(没有继承并且不基于公共接口)。

背景:我有一个基于 LINQ to SQL 的存储库实现。我将 LINQ to SQL 实体投影到我的模型实体中,以将我的模型保存在 POCO 中。我想将表达式传递给存储库(作为规范的一种形式),但它们应该基于模型实体。但我不能将这些表达式传递给数据上下文,因为它需要基于 LINQ to SQL 实体的表达式。

0 投票
22 回答
254834 浏览

c# - 从 lambda 表达式中检索属性名称

通过 lambda 表达式传入时,是否有更好的方法来获取属性名称?这是我目前拥有的。

例如。

只有当属性是字符串时,它才会通过将其转换为成员表达式来工作。因为并非所有属性都是字符串,所以我必须使用对象,但它会为那些返回一元表达式。