2012-04-17 46 views
1

我們使用DynamicLinq.cs類並嘗試設置查詢的where子句以檢查按位數據值。動態表達式API - LINQ to SQL

枚舉的例子(具有標誌屬性的枚舉):

None = 0 

Flag1 = 1 

Flag2 = 2 

Flag3 = 4 

我們特別希望實現的是返回不含「標誌1」值,即排除1,3,5 & 7解析的值數據。我相信,在標準的LINQ中,你可以通過使用類似「&〜」的方法來實現這一目標,但我們似乎無法讓Dynamic Expression 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個比特(通過施加% 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 

因此,這可以在由動態LINQ理解的數學方式表達,以檢查是否第三標誌Flag3不設置:

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

對不起,我有點困惑,你真的在​​這裏暗示,你能給我多一點細節嗎? – 2012-04-17 15:06:35

+0

'Where(「MyFlag%2 <1」)'將檢查不包括'Flag1 = 1'的值。這是Dynamic LINQ中缺少按位運算符支持的解決方法。 – mellamokb 2012-04-17 15:18:38

+0

有你。謝謝:) – 2012-04-17 15:26:24