【问题标题】:Dynamic Expression API - LINQ to SQL动态表达式 API - LINQ to SQL
【发布时间】:2012-04-17 14:08:36
【问题描述】:

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

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

None = 0 

Flag1 = 1

Flag2 = 2

Flag3 = 4

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

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

【问题讨论】:

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


    【解决方案1】:

    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 &amp; Flag3 == 0),也就是说,当你按位 andFlag3 时,你应该得到 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")
    

    【讨论】:

    • 对不起,我对你在这里的实际建议有点困惑,请你给我更详细的信息吗?
    • Where("MyFlag % 2 &lt; 1") 将检查除Flag1 = 1 之外的值。这是动态 LINQ 中缺乏按位运算符支持的解决方法。
    • 我还对数学背后的逻辑及其工作原理进行了更多解释。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-03
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多