LINQ to Entities : résolution de l'exception « Méthode non reconnue »
La migration de bases de données entraîne souvent des problèmes de reconnaissance de méthodes. Une erreur courante est :
"LINQ to Entities ne reconnaît pas la méthode 'System.String ToString()', et cette méthode ne peut pas être traduite en une expression de magasin."
Cela se produit généralement lors de la comparaison d'une propriété de chaîne avec une expression de chaîne, comme ceci :
<code>IQueryable<entity> pages = from p in context.pages where p.Serial == item.Key.ToString() select p;</code>
Comprendre la cause profonde :
La méthode ToString()
n'est pas directement exécutée mais traitée comme un MethodGroup. LINQ tente de traduire ce groupe en une expression SQL équivalente. Si la base de données cible ne dispose pas d'un ToString()
équivalent direct, la traduction échoue.
Résolution : pré-stockage de la valeur de la chaîne :
La solution la plus simple consiste à stocker le résultat de la chaîne dans une variable avant la comparaison :
<code>string strItem = item.Key.ToString(); IQueryable<entity> pages = from p in context.pages where p.Serial == strItem select p;</code>
Cela supprime l'appel ToString()
de la requête, évitant ainsi l'erreur de traduction.
Alternative : tirer parti de SQLFunctions :
La classe d'assistance SqlFunctions
offre des fonctions spécifiques à la base de données pour les requêtes LINQ to Entities. Pour ToString()
, vous pouvez essayer :
<code>IQueryable<entity> pages = from p in context.pages where SqlFunctions.StringConvert((decimal?)p.Serial) == item.Key select p;</code>
Notez le cast vers (decimal?)
qui est souvent nécessaire en fonction du type de base de données sous-jacente de p.Serial
. SqlFunctions
peut rationaliser le code et éviter les variables temporaires, mais nécessite un examen attentif des types de données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!