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

linq-to-sql - Options for code sharing in Linq2SQL expressions

I have a pair of Linq to SQL queries which contain the same complex Where clause, specifically:

And rather than copy and paste this chunk of code all over the place, I wanted to refactor it out into something else that can be shared. I know I can't do this with a normal method as it cannot be translated into SQL, but I also can't get the

Expression < Func<...>>

things described here to work either.

If I simplify the where clause for the purpose of my sanity here, I want to turn

into an expression, so I tried:

This appears to compile, but I can't seem to get the where statement to work, I have tried the following:

but this gives me a compile time error:

Cannot implicitly convert type 'System.Linq.Expressions.Expression>' to 'bool'

Any ideas? Also, assuming we get this working, can I simply extend the lambda expression in the Expression < Func <>> to include the other conditions?

0 投票
0 回答
1081 浏览

vb.net - LINQ 和 VB.NET 以及编译的表达式树正在破坏 SubSonic 3

我一直在尝试解决 VB.NET 和它喜欢生成的表达式树的一个小问题。

我有一个简单的测试...

人们会期望它可以工作,但该item.EmployeeID = 1位存在问题,这只是 VB.NET 的问题,而不是 C# 的问题。VB.NET 喜欢巧妙地使用它编译的表达式树,因为它可以item.EmployeeID为空!(阅读与此相关的博客

问题是表达式被表达式节点item.EmployeeID = 1包裹。Convert此时 TSql 生成器完全丢失并创建以下WHERE子句。

该片段在数据库上执行时往往会失败。

所以这似乎是 SubSonic 中的一个错误。不幸的是,试图弄清楚如何/在哪里修复它让我很头疼!


不过它确实变得更有趣了。

但它的WHERE条款是...

好吧,这似乎不是最理想的!但至少它有效。

最后,在阅读了博客条目后,似乎可以解决上面的原始示例。在 VB.NET 中使用新的合并运算符 (If)...

这产生了这个WHERE条款......

一个稍微更简洁的查询,尽管使用ISNULLCOALESCE? 也许只是在跨 SQL 版本的兼容性方面。


基本上,我希望第一个示例按原样工作。我还希望第二个示例继续工作,但生成更清晰的 SQL。

我想自己解决这个问题,但除了意识到我在 VB.NETs 表达式树生成方面存在一些问题之外,还没有走得太远。

0 投票
1 回答
642 浏览

.net - 如何编写动态 VB.net 代码?

例如,我有一个类,它有自己的属性,我将类的名称和要调用的属性的名称传递给函数

比如说 exp 是我传递的变量,它包含一个 value = "ClassA,Property1"

我想做类似的事情,如上所述。

0 投票
1 回答
1494 浏览

c# - 计算具有许多参数的表达式树

我正在尝试使用 .Net 3.5 中的 Expression 树和 Lamdba Expression 对象来允许我动态计算用户输入的布尔表达式。

到目前为止,用户可以创建一个表达式树,其中包含BinarayExpressions表示为的 AND 和 OR 值ParameterExpressions。然后我计划LambdaExpression基于该树创建一个,以便我可以将表达式编译成一个委托,然后我可以调用它。我遇到的问题是我不知道用户需要多少输入参数,所以当我将表达式编译成委托时,我不知道方法签名应该是什么,直到运行时。

到目前为止,我提出了两种可能的解决方案。

  1. 创建一大堆委托,例如Func<bool, bool, bool...>可以采用我认为用户可能需要的尽可能多的参数的委托。这感觉不是最优雅的解决方案,但我认为它会起作用,直到有人想要使用比我满足的更多的参数。
  2. 传入一个值数组,并使用数组索引器以某种方式将它们分配给我的参数。我已经考虑过这一点,但无法弄清楚它是如何工作的。

注意:它需要很快,所以没有拳击或类似的东西。

0 投票
1 回答
2195 浏览

c# - LINQ-to-SQL 编译查询问题(作为未编译查询工作)

我有 C# 扩展方法IQueryable,例如FindNewCustomers()等等FindCustomersRegisteredAfter(int year),我使用这些方法将 LINQ to SQL 的查询“链接”在一起。

现在我的问题:我想创建编译查询,例如:

FindCustomersRegisteredAfter(int year)方法是一个扩展方法,采用IQueryable并返回相同的值。该OrderBy方法也是一种扩展方法 (System.Linq.Dynamic),它基于字符串创建动态表达式(例如,“FirstName ASC”将对字段 FirstName 升序排序)。Skip并且Take是内置方法。

以上(不是编译查询,而是常规查询)完美运行。将其放入已编译的查询中后,我遇到了以下错误:

方法 'System.Linq.IQueryable`1[Domain.Customer] FindCustomersRegisteredAfter[Customer](System.Linq.IQueryable`1[Domain.Customer], Int32)' 不支持对 SQL 的转换。

再一次,如果查询是非编译的,这只是一个常规的 LINQ 查询。只有在 CompiledQuery.Compile() 中出现错误时才会出现该错误。

帮助??!

编辑:如果我通过 var query = (...) 以与 CompiledQuery.Compile 内部相同的方式创建查询,则生成的 SQL 如下:

所以你看到 SQL 都是完全可翻译的,所以我只需要填写@p0、@p1 和@p2 就可以重复工作!CompiledQuery.Compile 有什么问题?!?

更新:我知道 OrderBy 不能工作(因为它不是 @p 参数)。我仍在试图弄清楚为什么 CompiledQuery.Compile 不能与我的扩展方法一起使用。互联网上有关该主题的信息几乎不存在。

0 投票
3 回答
3496 浏览

c# - 如何评估 LINQ 表达式树中的独立布尔表达式

我正在使用标准访问者模式来遍历 LINQ 表达式树,以生成动态 SQL WHERE 子句。

我的问题是,与 C# 不同,您不能在 SQL 中使用独立的布尔表达式;您必须将其与 1 或 0 进行比较。

给定这个假设的 lambda 表达式:

很容易错误地生成此代码:

或此代码:

两者当然都会产生 SQL 错误。当我深入研究子树以找出可能的情况时,我应该应用什么逻辑来解决这个问题,而我的代码开始看起来真的很迟钝?

编辑:上面的例子当然是多余的——我只是用它来说明一点。

可以创建此场景的示例:

当然,最后一个例子的风格很差,但我的代码被设计为独立于程序员的技能水平工作,所以不满足冗余场景对我来说是一种糟糕的形式。

0 投票
1 回答
117 浏览

lambda - 以声明方式构建以任何类型节点为根的表达式树

MSDN 说:

编译器还可以为您构建表达式树。编译器生成的表达式树始终植根于 Expression<TDelegate> 类型的节点;也就是说,它的根节点代表一个 lambda 表达式。

但是,如果我想构建一个以 MethodCallExpression、BinaryExpression 等类型的节点为根的表达式树呢?并且不想手动执行此操作。

0 投票
6 回答
27648 浏览

c# - lambda 表达式中的 C# 切换

是否可以在 lambda 表达式中进行切换?如果不是,为什么?Resharper 将其显示为错误。

0 投票
5 回答
4186 浏览

c# - 查询过滤器表达式树的解析器

我正在寻找可以对查询过滤器进行操作的解析器。但是,我不太确定这些术语,因此证明工作很辛苦。我希望有人能帮助我。我读过“递归下降解析器”,但我想知道这些是否适用于成熟的语言解析器,而不是我正在寻找的逻辑表达式评估。

理想情况下,我正在寻找 .NET 代码 (C#),但也在寻找在 T-SQL 中工作的类似解析器。

我想要的是解析的东西,例如:

((a=b)|(e=1))&(c<=d)

理想情况下,运算符可以是可定义的(例如 '<' vs 'lt'、'=' vs '==' vs 'eq' 等)并且我们可以指定函数类型标签(例如 (left(x,1)= 'e'))。解析器加载它,遵循顺序优先级(并且理想情况下处理缺少任何括号),然后使用表达式回调我的代码以评估布尔结果 - 例如'a = b'?)。我不希望解析器理解表达式中的自定义函数(尽管一些基本函数会很有用,比如字符串拆分)。将表达式拆分(分成左右两部分)会很好。

解析器最好询问最少数量的问题来计算最终结果 - 例如,如果 AND 的一侧为假,则评估另一侧没有意义,并首先评估最简单的一侧(即上面的表达式,'c<=d' 应该被认为更快,因此首先被评估。

我可以想象这是很多工作要做,但是,相当普遍。任何人都可以给我任何指示吗?如果没有像上面那样灵活的解析器,是否有任何基本的解析器可以用作开始?

非常感谢

0 投票
4 回答
1206 浏览

c# - C# 重构 lambda 表达式

我有几个Expression<Func<User,bool>>共享属性的表达式。例如,

有没有一种简单的方法可以将变量放入u.IsActive && u.Group != "PROCESS"变量中并在 e1、e2 和 e3 中使用它?编辑:我仍然想要同一棵树。

似乎我可以通过使用Expression.Lambda<Func<User, bool>>(BinaryExpression.AndAlso(etc 构建表达式来做到这一点......但不是简化我的代码,而是让它更难阅读。