我有一个库,它使用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)
。
我一直在谷歌上搜索这两天,我似乎无法找到答案。
提前感谢您的帮助。
答案 0 :(得分:2)
not的节点类型不适用于!(expression)
仅适用于!expression
- 括号不属于它。
源代码中必须使用括号来指示所需的优先级。它们在表达式树中不是必需的,因为优先级是树中固有的。
如果你不介意有时候有额外的括号,你可以让你的字符串转换总是包含它们。因此,每次使用带有操作数表达式x
和y
的OR或AND表达式时,只需将其转换为(x || y)
或(x && y)
,无条件地包括这些括号。它可能看起来不漂亮,但总会给你正确的优先权。