条件分组正在被删除

时间:2012-02-15 16:30:57

标签: c# .net nhibernate linq-to-nhibernate

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;

这是一个很大的问题,因为它会显着改变查询条件。

这是一个已知问题还是我做错了什么?

2 个答案:

答案 0 :(得分:5)

因为AND的操作顺序优先于OR,所以不需要括号,因此查询提供程序不会添加冗余信息。

为了帮助记住操作顺序,布尔AND被认为类似于乘法(在二进制值上),并且OR被认为类似于二进制值上的加法。处理布尔代数时(在非编程环境中)实际上并非常见的是使用*代表AND而+代表OR。

答案 1 :(得分:1)

AND的优先级高于OR,就像乘法的优先级高于加法一样。

因此,括号是多余的,并且在表达式树中不存在。