2012-04-17 20 views
1

DynamicLinq.csクラスを使用しており、ビット単位のデータ値をチェックするためにクエリのwhere句を設定しようとしています。動的式API - LINQ to SQL

列挙の例は、(フラグが列挙の属性があります):

None = 0 

Flag1 = 1 

Flag2 = 2 

Flag3 = 4 

は、私たちが特に達成したいことは「フラグ1」の値は1、3、5 & 7の解決された値を除外すなわち除いたデータを返すことです。私は、標準のLINQでは、 "&〜"のようなものを使用してこれを達成できると信じていますが、動的表現APIが私たちがやっていることを受け入れることができない場合、結果のクエリの解析は常に失敗します。

ダイナミックエクスプレッションAPIでビット単位の列挙型を操作して操作する方法を知っている人はいますか?

答えて

1

動的linqソースコードを見てみると、ビット単位の操作はサポートされていません。

3

ダイナミックLINQはビット単位の操作をサポートしていないようです。あなたはビット演算のために、この同等の数式を使用して周りに取得することができます:

(a & 2^n == 0) <==> a % 2^(n+1) < 2^n 

ダイナミックLINQライブラリは、あなたがこれを達成することができますので、MOD演算子(%)をサポートしています:

​​

基本的にはどのようにこれは機能します。 Flag3を除いたすべての値を検索するとします。 Flag3 = 4以降は、4 = 2^2なので、n=2です。これを書くための標準的な方法は、(MyFlagValue & Flag3 == 0)です。つまり、ビット単位でandFlag3とすると、フラグが含まれていないことを表す0が得られます。

値が3-場合、値あろう未満4、である場合、これはまた、最も右側の3ビット(% 8を適用することにより)をつかんで、そしてチェックすることにより、任意のビット単位の演算子を使用せずに数学的に表すことができます。 from-rightビットは設定されません。そう例えば、MyFlagValue=58別の例として、MyFlagValue=14

MyFlagValue =   14 = 0b1110 
MyFlagValue % 8 =  6 = 0b0110 
MyFlagValue % 8 < 4 = false^which means 3-from-right bit (Flag3) is set 

有する:

MyFlagValue =   58 = 0b111010 
MyFlagValue % 8 =  2 = 0b000010 
MyFlagValue % 8 < 4 = true ^which means 3-from-right bit (Flag3) is NOT set 

ので、これは第3のフラグFlag3でないかどうかをチェックするために、動的LINQによって理解される数学的な方法で表すことができます。設定:

Where("MyFlagValue % 8 < 4") 
+0

申し訳ありませんが、あなたが実際にここに示唆していることでちょっと混乱しています。もう少し詳しく教えてください。 –

+0

'(" MyFlag%2 <1 ")'は、Flag1 = 1を除いた値をチェックします。これは、動的LINQでのビット単位の演算子サポートの欠如に対する回避策です。 – mellamokb

+0

すみません。ありがとう:) –