2012-04-17 5 views
1

우리는 DynamicLinq.cs 클래스를 사용하고 있으며 비트 데이터 값을 확인하기 위해 쿼리의 where 절을 설정하려고 시도하고 있습니다.동적 식 API - LINQ to SQL

열거 예 (플래그 열거에 속성이있다) :

None = 0 

Flag1 = 1 

Flag2 = 2 

Flag3 = 4 

은 우리가 구체적으로 달성하고자하는 것은 'FLAG1'값은 1, 3, 5 & 7 해결 된 값을 제외 즉 제외한 데이터를 반환하는 것입니다. 나는 표준 LINQ에서 "& ~"과 같은 것을 사용하여 이것을 달성 할 수 있다고 믿지만 동적 표현 API가 우리가하는 것을 받아들이는 것처럼 보이지 않을 수있다. 결과 쿼리의 파싱은 항상 실패 할 것이다.

동적 표현 API에서 비트 열거 형을 조작하고 조작하는 방법을 아는 사람이 있습니까?

답변

1

동적 linq 소스 코드를 빠르게 살펴보면 비트 연산이 지원되지 않습니다.

3

동적 LINQ가 비트 단위 작업을 지원하지 않는 것 같습니다. 당신은 비트 연산이 동등한 수학 공식을 사용하여 주위를 얻을 수 있습니다 :

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

동적 LINQ 도서관이 수행 할 수 있도록 모드 연산자 (%를) 지원하지 않습니다 : 기본적으로 방법

Where("MyFlag % 2 < 1") 

을 이 작품. Flag3을 제외한 모든 값을 찾으려고한다고 가정합니다. Flag3 = 4 이후로는 4 = 2^2이므로 n=2입니다. 이것을 쓰는 표준 방법은 (MyFlagValue & Flag3 == 0) 일 것입니다. 즉, 비트 단위로 andFlag3으로 쓸 때, 플래그가 포함되지 않았 음을 나타내는 0을 얻어야합니다.

이것은 가장 오른쪽의 3 비트 (% 8 적용)를 잡아서 비트 단위 연산자를 사용하지 않고 수학적으로 표현할 수 있으며 값이 4보다 작은 지, 오른쪽에서부터 비트가 설정되지 않습니다. 제 플래그 Flag3 그렇지 않으면 확인

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

그래서 동적 LINQ 이해하는 수학 식으로 표현 될 수있다 : MyFlagValue=58MyFlagValue=14

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

다른 예, 예를 들어 그럼 세트 :

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

죄송합니다. 귀하가 실제로 여기 제안하신 내용으로 조금 혼란 스럽습니다. 조금 더 자세하게 설명해 주시겠습니까? –

+0

'("MyFlag % 2 <1")은'Flag1 = 1'을 제외한 값을 확인합니다. 동적 LINQ에서 비트 단위 연산자 지원이 부족한 경우 해결 방법입니다. – mellamokb

+0

나왔습니다. 고마워요 :) –