J'essaye de construire dynamiquement un arbre d'expression en C#, qui est compilé et utilisé comme prédicat pour l'appel LINQ-to-SQL Where(). Le problème est que j'essaie de comparer un Enum (avec int comme type sous-jacent) directement à un Int, mais cela échoue avec l'erreur "Le membre MyEnumType n'a pas de traduction supportée par SQL".Comment convertir un Enum en un Int pour une utilisation dans une opération Expression.Equals?
code:
ParameterExpression param = Expression.Parameter(typeof(MyClass), "obj"); //input parameter - this exposes a property of the Enum type
MemberExpression enumMember = Expression.Property(param, "MyEnumProperty"); //used to get the Enum typed property from the parameter
//MISSING STEP TO CAST THE ENUM OF THE MEMBER EXPRESSION TO AN INT?
BinaryExpression binaryExpr = Expression.Equal(enumMember, Expression.Constant(1));
LambdaExpression<Func<MyClass, bool>> whereClause = Expression.Lambda(binaryExpr, param);
//when whereClause is used to filter LINQ-to-SQL results, the error is thrown
Je suis assez nouveau pour les arbres d'expression et je ne peux pas comprendre cela. J'ai essayé d'utiliser
Expression.Convert(enumMember, typeof(int))
comme première partie de l'expression binaire mais cela ne le résout pas.
Toute aide est très appréciée.
ont aucune idée sur la façon d'obtenir la valeur de ENUM dans l'arbre d'expression –
Après un peu plus creuser, j'ai décidé que le problème ici est ma compréhension LINQ to SQL plutôt que avec l'Expression elle-même. La propriété Enum sur mon objet entité n'est pas réellement une colonne dans la base de données; Je pense que c'est pourquoi il n'est pas capable de le traduire en clause where. Je vais adopter une approche différente, mais si quelqu'un a des idées, n'hésitez pas à partager. –
Pouvez-vous également fournir le code pour MyClass? Le code que vous avez actuellement dans le message est assez passif, pas grand chose à dire d'ici ... – code4life