1

DynamicLinq.cs クラスを使用しており、クエリの where 句を設定してビット単位のデータ値をチェックしようとしています。

列挙の例 (列挙に Flags 属性があります):

None = 0 

Flag1 = 1

Flag2 = 2

Flag3 = 4

具体的に達成したいのは、'Flag1' 値を除いたデータを返すことです。つまり、解決された 1、3、5、および 7 の値を除外します。~」ですが、Dynamic Expression API が実行していることを受け入れることができないようです。結果のクエリの解析は常に失敗します。

動的式 API でビットごとの列挙を操作および操作する方法を知っている人はいますか?

4

2 に答える 2

3

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")
于 2012-04-17T14:29:55.647 に答える
1

動的な linq ソース コードをざっと見てみると、ビット演算がサポートされていないことがわかります。

于 2012-04-17T14:25:59.503 に答える