결과적으로 이진 및 / 또는 이진 또는 연산 인 표현식을 만들고 싶습니다. 같은 것
int a = 1;
int b = 2;
int c = 3;
int d = a & b; // d = 0
int e = a & c; // e = 1
나는 동적 인 linq에서 아무것도 발견하지 못했다! 그러나 linq에서 이것은 정상적인 표현입니다!
public class Customer{
[Flags]
public enum Status{
None = 0,
Blocked = 1,
Present = 2,
Paid = 4
}
// Holds the numeric status from database.
public int CustomerStatusValue{get; set;}
}
var listOfCustomers = new List<Customer>(); // Would load from db...
// This works in linq
var result = listOfCustomers.Where(c => (c.CustomerStatusValue & 3) != 0);
// This does not work!!!
var result = listOfCustomers.AsQueryable()..Where("(CustomerStatusValue & 3) != 0");
Frédric의 제안에 따라 System.Dynamic.Linq 파일을 다운로드하여 '&'및 '|'로 변경했습니다. 연산자 :
// +, -, &, | operators Expression ParseAdditive() { Expression left = ParseMultiplicative(); while (token.id == TokenId.Plus || token.id == TokenId.Minus || token.id == TokenId.Amphersand || token.id == TokenId.Bar) { Token op = token; NextToken(); Expression right = ParseMultiplicative(); switch (op.id) { case TokenId.Plus: if (left.Type == typeof(string) || right.Type == typeof(string)) goto case TokenId.Amphersand; CheckAndPromoteOperands(typeof(IAddSignatures), op.text, ref left, ref right, op.pos); left = GenerateAdd(left, right); break; case TokenId.Minus: CheckAndPromoteOperands(typeof(ISubtractSignatures), op.text, ref left, ref right, op.pos); left = GenerateSubtract(left, right); break; case TokenId.Amphersand: if (IsNumericType(left.Type) && IsNumericType(right.Type)) { left = GenerateBinaryAnd(left, right); } else{ left = GenerateStringConcat(left, right); } break; case TokenId.Bar: if (IsNumericType(left.Type) && IsNumericType(right.Type)) { left = GenerateBinaryOr(left, right); } else { left = GenerateStringConcat(left, right); } break; } } return left; } Expression GenerateBinaryAnd(Expression left, Expression right) { return Expression.MakeBinary(ExpressionType.And, left, right); } Expression GenerateBinaryOr(Expression left, Expression right) { return Expression.MakeBinary(ExpressionType.Or, left, right); }
ParseAdditive 함수를 대체하고 이진 연산을 만드는 두 가지 새로운 기능을 만들었습니다. .Where ( "(a & B)> 0")와 같은 것들이 이제 작동합니다 !!!!
오류 검사가 누락되어 'ParseAdditive'함수의 이름이 올바른 위치 또는 이름이 아니기 때문에 최종 버전이 아니지만 작동합니다.