c# - 动态表达式 API - LINQ to SQL

标签 c# linq-to-sql bit-manipulation enumeration dynamic-linq

我们正在使用 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/

相关文章:

rust - 翻转 boolean 值的最快方法

c# - 如何将 RSS 功能添加到我的网站?

C# 4 - 具有适当 ProgressBar 控件的 DataGridView

c# - 如何内部连接来自不同数据上下文的表?

c# - Linq to SQL DataContext 生命周期管理问题

sql-server - 从 LINQ to SQL 迁移到 DocumentDB 的好方法是什么?

c# - 重复同时播放30种音效

c# - 接口(interface)声明和通用约束

java - f(int x) { 返回 x == 0 ? 0 : 1; } in Java without conditionals

c++ - 移位运算符忽略数据大小