用c#中的ExpressionVisitor识别lambda表达式中的圆括号
本文关键字:表达式 圆括号 lambda 识别 中的 ExpressionVisitor | 更新日期: 2023-09-27 18:13:28
我有一个使用ExpressionVisitor
类将lambda表达式转换为odata筛选器字符串的库。例如,表达式o => o.Teste == null && !(o.Date != DateTime.Now)
变为$filter=Teste eq null and not(Date ne xx/xx/xx)
很好。问题是当我必须用括号()对条件的部分进行分组时。圆括号被忽略,它只写没有圆括号的条件。例如,表达式(o => o.Name != null && o.Name == "Joe") || !(o.Date != DateTime.Now)
变为$filter=Name ne null and Name eq 'Joe' or not(Date ne xx/xx/xx)
奇怪的是,ExpessionVisitor
似乎没有识别括号,它有一个NodeType
不是!(expression)
,但它没有(expression)
。
我在谷歌上搜索这个问题已经两天了,但我似乎找不到答案。
提前感谢您的帮助。
not的节点类型不是!(expression)
的,它只是!expression
-括号不是它的一部分。
在源代码中必须使用括号来指示您想要的优先级。它们在表达式树中是不必要的,因为优先级是树固有的。
如果你不介意有时有额外的括号,你可以让你的字符串转换总是包含它们。所以每次你有一个或或和与运算式的操作数表达式x
和y
,只要把它变成(x || y)
或(x && y)
,无条件地包括那些括号。它可能看起来不漂亮,但它总是会给你正确的优先级。