1

我们正在使用 DynamicLinq.cs 类并尝试设置查询的 where 子句以检查按位数据值。

枚举示例(枚举上有 Flags 属性):

None = 0 

Flag1 = 1

Flag2 = 2

Flag3 = 4

我们特别想要实现的是返回不包括“Flag1”值的数据,即排除已解析的 1、3、5 和 7 值。我相信在标准 LINQ 中,您可以通过使用“& ~”但是我们似乎无法让动态表达式 API 接受我们正在做的事情,结果查询的解析总是会失败。

有谁知道如何在动态表达式 API 中操作和使用按位枚举?

4

2 回答 2

3

看起来动态 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")
于 2012-04-17T14:29:55.647 回答
1

快速浏览动态 linq 源代码显示不支持按位运算。

于 2012-04-17T14:25:59.503 回答