看起来动态 LINQ 不支持按位操作。您可以通过使用这个等效的数学公式来解决按位运算:
(a & 2^n == 0) <==> a % 2^(n+1) < 2^n
动态 LINQ 库确实支持 mod 运算符 ( %
),因此您可以完成此操作:
Where("MyFlag % 2 < 1")
基本上这是如何工作的。假设您要查找所有排除 的值Flag3
。既然Flag3 = 4
,就是4 = 2^2
这样n=2
。标准的写法是 ( MyFlagValue & Flag3 == 0
),也就是说,当你按位and
使用时Flag3
,你应该得到 0,表示不包括标志。
这也可以通过抓取最右边的 3 位(通过应用% 8
)在不使用任何位运算符的情况下以数学方式表示,并检查该值是否小于4
,如果从右起 3 位不是,则该值将是放。例如,与MyFlagValue=14
MyFlagValue = 14 = 0b1110
MyFlagValue % 8 = 6 = 0b0110
MyFlagValue % 8 < 4 = false ^ which means 3-from-right bit (Flag3) is set
另一个例子,其中MyFlagValue=58
:
MyFlagValue = 58 = 0b111010
MyFlagValue % 8 = 2 = 0b000010
MyFlagValue % 8 < 4 = true ^ which means 3-from-right bit (Flag3) is NOT set
因此,这可以用 Dynamic LINQ 理解的数学方式表示,以检查是否未Flag3
设置第三个标志:
Where("MyFlagValue % 8 < 4")