问题标签 [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.
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?
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
条款......
一个稍微更简洁的查询,尽管使用ISNULL
与COALESCE
? 也许只是在跨 SQL 版本的兼容性方面。
基本上,我希望第一个示例按原样工作。我还希望第二个示例继续工作,但生成更清晰的 SQL。
我想自己解决这个问题,但除了意识到我在 VB.NETs 表达式树生成方面存在一些问题之外,还没有走得太远。
.net - 如何编写动态 VB.net 代码?
例如,我有一个类,它有自己的属性,我将类的名称和要调用的属性的名称传递给函数
比如说 exp 是我传递的变量,它包含一个 value = "ClassA,Property1"
我想做类似的事情,如上所述。
c# - 计算具有许多参数的表达式树
我正在尝试使用 .Net 3.5 中的 Expression 树和 Lamdba Expression 对象来允许我动态计算用户输入的布尔表达式。
到目前为止,用户可以创建一个表达式树,其中包含BinarayExpressions
表示为的 AND 和 OR 值ParameterExpressions
。然后我计划LambdaExpression
基于该树创建一个,以便我可以将表达式编译成一个委托,然后我可以调用它。我遇到的问题是我不知道用户需要多少输入参数,所以当我将表达式编译成委托时,我不知道方法签名应该是什么,直到运行时。
到目前为止,我提出了两种可能的解决方案。
- 创建一大堆委托,例如
Func<bool, bool, bool...>
可以采用我认为用户可能需要的尽可能多的参数的委托。这感觉不是最优雅的解决方案,但我认为它会起作用,直到有人想要使用比我满足的更多的参数。 - 传入一个值数组,并使用数组索引器以某种方式将它们分配给我的参数。我已经考虑过这一点,但无法弄清楚它是如何工作的。
注意:它需要很快,所以没有拳击或类似的东西。
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 不能与我的扩展方法一起使用。互联网上有关该主题的信息几乎不存在。
c# - 如何评估 LINQ 表达式树中的独立布尔表达式
我正在使用标准访问者模式来遍历 LINQ 表达式树,以生成动态 SQL WHERE 子句。
我的问题是,与 C# 不同,您不能在 SQL 中使用独立的布尔表达式;您必须将其与 1 或 0 进行比较。
给定这个假设的 lambda 表达式:
很容易错误地生成此代码:
或此代码:
两者当然都会产生 SQL 错误。当我深入研究子树以找出可能的情况时,我应该应用什么逻辑来解决这个问题,而我的代码开始看起来真的很迟钝?
编辑:上面的例子当然是多余的——我只是用它来说明一点。
可以创建此场景的示例:
当然,最后一个例子的风格很差,但我的代码被设计为独立于程序员的技能水平工作,所以不满足冗余场景对我来说是一种糟糕的形式。
lambda - 以声明方式构建以任何类型节点为根的表达式树
MSDN 说:
编译器还可以为您构建表达式树。编译器生成的表达式树始终植根于 Expression<TDelegate> 类型的节点;也就是说,它的根节点代表一个 lambda 表达式。
但是,如果我想构建一个以 MethodCallExpression、BinaryExpression 等类型的节点为根的表达式树呢?并且不想手动执行此操作。
c# - lambda 表达式中的 C# 切换
是否可以在 lambda 表达式中进行切换?如果不是,为什么?Resharper 将其显示为错误。
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' 应该被认为更快,因此首先被评估。
我可以想象这是很多工作要做,但是,相当普遍。任何人都可以给我任何指示吗?如果没有像上面那样灵活的解析器,是否有任何基本的解析器可以用作开始?
非常感谢
李
c# - C# 重构 lambda 表达式
我有几个Expression<Func<User,bool>>
共享属性的表达式。例如,
有没有一种简单的方法可以将变量放入u.IsActive && u.Group != "PROCESS"
变量中并在 e1、e2 和 e3 中使用它?编辑:我仍然想要同一棵树。
似乎我可以通过使用Expression.Lambda<Func<User, bool>>(BinaryExpression.AndAlso(
etc 构建表达式来做到这一点......但不是简化我的代码,而是让它更难阅读。