用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)

我在谷歌上搜索这个问题已经两天了,但我似乎找不到答案。

提前感谢您的帮助。

用c#中的ExpressionVisitor识别lambda表达式中的圆括号

not的节点类型不是!(expression)的,它只是!expression -括号不是它的一部分。

在源代码中必须使用括号来指示您想要的优先级。它们在表达式树中是不必要的,因为优先级是树固有的。

如果你不介意有时有额外的括号,你可以让你的字符串转换总是包含它们。所以每次你有一个或或和与运算式的操作数表达式xy,只要把它变成(x || y)(x && y),无条件地包括那些括号。它可能看起来不漂亮,但它总是会给你正确的优先级。