我们正在使用 DynamicLinq.cs 类并尝试设置查询的 where 子句以检查按位数据值。
枚举示例(枚举上有Flags属性):
None = 0
Flag1 = 1
Flag2 = 2
Flag3 = 4
我们特别想要实现的是返回不包括“Flag1”值的数据,即排除已解析的值 1、3、5 和 7。我相信在标准 LINQ 中,您可以通过使用“& ~”之类的东西来实现这一点,但是我们似乎无法让动态表达式 API 接受我们正在做的事情,结果查询的解析总是会失败。
有谁知道如何在 Dynamic Expression API 中操作和使用按位枚举?
最佳答案
看起来 Dynamic LINQ 不支持按位操作。您可以使用这个等效的数学公式来进行按位运算:
(a & 2^n == 0) <==> a % 2^(n+1) < 2^n
Dynamic LINQ 库确实支持 mod 运算符 (%
),因此您可以完成此操作:
Where("MyFlag % 2 < 1")
基本上这是如何工作的。假设您要查找排除 Flag3
的所有值。由于Flag3 = 4
,即4 = 2^2
,所以n=2
。标准的写法是 (MyFlagValue & Flag3 == 0
),也就是说,当你用 Flag3
按位 and
时,你应该得到0,代表不包含flag。
这也可以在不使用任何按位运算符的情况下通过获取最右边的 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")
关于c# - 动态表达式 API - LINQ to SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10192855/