Je veux créer une expression qui est par conséquent un binaire et / ou un binaire ou une opération. Quelque chose comme
int a = 1;
int b = 2;
int c = 3;
int d = a & b; // d = 0
int e = a & c; // e = 1
Je n'ai rien trouvé dans linq dynamique! Mais en linq c'est une expression 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");
Sur la base de la suggestion de Frédéric, j'ai téléchargé le fichier System.Dynamic.Linq et l'ai changé pour '&' et '|' opérateurs:
// +, -, &, | 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); }
J'ai remplacé la fonction ParseAdditive et créé deux nouvelles fonctions qui font une opération binaire. Donc, des choses comme .Where ("(a & B)> 0") fonctionnent maintenant !!!!
Ce n'est pas une version finale car il manque des vérifications d'erreurs et le nom de la fonction 'ParseAdditive' n'est peut-être pas le bon endroit ou le bon nom, mais cela fonctionne.