Arbres d'expression et types nullables

c# entity-framework expression-trees

Question

J'ai joué avec Expression Trees. J'ai la méthode simple suivante qui effectue une requête en créant dynamiquement un arbre d'expression. ItemType est un int nullable dans la base de données, ainsi que dans la classe d'entité EF . Pour une raison quelconque, si la requête génère l'erreur de

Exception non gérée: System.InvalidOperationException: l'opérateur binaire Equal n'est pas défini pour les types 'System.Nullable`1 [System.Int32]' et 'System.Int32'.

Je ne pense pas que je demande à EF de convertir quoi que ce soit. J'ai mon paramètre défini comme int? , qui est ce que je pensais que cela devrait être.

Remarque, j'ai regardé ça

Utilisation de types nullables dans les arborescences d'expression

Mais ce gars-là essaie de transmettre sa valeur int nullable typée en tant qu’objet, ce avec quoi EF a des problèmes. En fait, je déclare que c'est le bon type ab initio .

   public void GetResultCollection<T>() {
        MyEntities db = new MyEntities();
        var result = db.CreateQuery<T>(String.Format("[{0}]", typeof(T).Name + "s"));

        int? ItemTypeValue = 1;

        var param = Expression.Parameter(typeof(T));

        var lambda = Expression.Lambda<Func<T, bool>>(
            Expression.Equal(
                Expression.Property(param, "ItemType"),
                Expression.Constant(ItemTypeValue)),
            param);

        var list = result.Where(lambda).ToList();
    }

MODIFIER

J'ai aussi essayé ItemTypeValue.Value - même erreur

Réponse acceptée

Je pense que vous avez besoin de le convertir

var right = Expression.Constant(ItemTypeValue , typeof(int?))
....

 var lambda = Expression.Lambda<Func<T, bool>>(
            Expression.Equal(
                Expression.Property(param, "ItemType"),
                right),
            param);



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi