Dynamic 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
ます。設定。たとえば、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
Flag3
したがって、これは、3 番目のフラグが設定されていないかどうかを確認するために Dynamic LINQ によって理解される数学的な方法で表現できます。
Where("MyFlagValue % 8 < 4")