Voglio creare un'espressione che di conseguenza è binaria eo binaria o operativa. Qualcosa di simile a
int a = 1;
int b = 2;
int c = 3;
int d = a & b; // d = 0
int e = a & c; // e = 1
Non ho trovato nulla in Linq dinamico! Ma in linq questa è un'espressione normale!
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");
Sulla base del suggerimento di Frédéric, ho scaricato il file System.Dynamic.Linq e l'ho modificato per '&' e '|' operatiors:
// +, -, &, | 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); }
Ho sostituito la funzione ParseAdditive e ho creato due nuove funzioni che eseguono un'operazione binaria. Quindi cose come .Where ("(a & B)> 0") ora funzioneranno !!!!
Non è una versione finale perché mancano controlli degli errori e il nome della funzione 'ParseAdditive' forse non è il posto o il nome giusto, ma funziona.