Entity Framework - Linq - Impossible de créer une valeur constante de type 'System.Object'. Seulement les types primitifs

entity-framework expression-trees linq

Question

J'ai une méthode pour construire une expression pour une requête linq pour un type, une propriété et une valeur donnés. Cela fonctionne à merveille tant que la propriété sur le type N'EST PAS nullable. Voici l'exemple sur lequel je travaille ( http://www.marcuswhitworth.com/2009/12/dynamic-linq-with-expression-trees ) J'appelle la méthode Equals sur la propriété. Cependant, j'ai découvert que la méthode Equals pour les types Nullable prend un objet en tant que paramètre au lieu du type Nullable. J'ai essayé d'utiliser GetValueOrDefault pour masquer les valeurs null, mais EF ne prend pas en charge cette méthode. Comme exemple simple, le code suivant va générer une erreur:

decimal? testVal = new decimal?(2100);
        var test = (from i in context.Leases where i.AnnualRental.Equals(testVal) select i).ToList();

Toutefois, si vous utilisez == à la place de la méthode Equals (), tout fonctionnera correctement. Je ne sais pas comment convertir le code pour utiliser == au lieu de Equals () cependant. Toutes les suggestions seront grandement appréciées.

Réponse populaire

Si vous dites == , vous générez une BinaryExpression avec NodeType comme ExpressionType.Equal . http://msdn.microsoft.com/en-us/library/bb361179.aspx

Si vous dites .Equals(x) , vous générez un MethodCallExpression . La MethodCallExpression s que LinqToEntities peut traduire en Sql est une liste restreinte (par exemple, aucune de vos propres méthodes non décorées ne figure dans cette liste). Nullable<T>.Equals(x) n'est apparemment pas sur cette liste.

Ne dites pas .Equals(x) à LinqToEntities.




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