LINQ to NHibernate删除where子句中的括号:
session.Query<MyEntity>().Where(x => (x.MyProp1 < end && x.MyProp1 > start) ||
(x.MyProp2 < end && x.MyProp2 > start));
这导致以下查询(请注意缺少的括号):
select <columns> from MY_ENTITY where MY_PROP1 < :p0 and MY_PROP1 > :p1 or
MY_PROP2 < :p2 and MY_PROP2 > :p3;
这是一个很大的问题,因为它会显着改变查询条件。
这是一个已知问题还是我做错了什么?
答案 0 :(得分:5)
因为AND的操作顺序优先于OR,所以不需要括号,因此查询提供程序不会添加冗余信息。
为了帮助记住操作顺序,布尔AND被认为类似于乘法(在二进制值上),并且OR被认为类似于二进制值上的加法。处理布尔代数时(在非编程环境中)实际上并非常见的是使用*代表AND而+代表OR。
答案 1 :(得分:1)
AND
的优先级高于OR
,就像乘法的优先级高于加法一样。
因此,括号是多余的,并且在表达式树中不存在。