Dépannage de l'erreur « Méthode ToString() non reconnue » dans LINQ to Entities
Lorsque vous travaillez avec LINQ to Entities, vous pouvez rencontrer l'erreur « LINQ to Entities ne reconnaît pas la méthode 'System.String ToString()'. » Cela se produit parce que LINQ to Entities a du mal à traduire la méthode ToString()
en une requête compatible avec la base de données. La solution consiste à éviter l'utilisation directe de ToString()
dans la requête LINQ.
Voici un exemple de code révisé qui résout ce problème :
<code class="language-csharp">using (var context = new Context()) { // ... foreach (var item in collection) { string strItem = item.Key.ToString(); // Assign ToString() result to a variable IQueryable<entity> pages = from p in context.pages where p.Serial == strItem select p; foreach (var page in pages) { DataManager.AddPageToDocument(page, item.Value); } } Console.WriteLine("Done!"); Console.Read(); }</code>
En pré-attribuant le résultat de item.Key.ToString()
à la variable strItem
, nous contournons le problème de traduction. La clause where
utilise désormais une chaîne littérale, que le fournisseur LINQ to Entities peut gérer efficacement.
Approche alternative : tirer parti de SQLFunctions
Entity Framework propose la classe d'assistance SqlFunctions
, fournissant des fonctions spécifiques à la base de données. Cela offre une solution plus élégante pour des cas comme celui-ci. La méthode SqlFunctions.StringConvert
permet la conversion au sein de la requête de base de données elle-même.
Voici comment mettre en œuvre cette solution :
<code class="language-csharp">using (var context = new Context()) { // ... foreach (var item in collection) { IQueryable<entity> pages = from p in context.pages where SqlFunctions.StringConvert((double?)p.Serial) == item.Key.ToString() //Note the cast to (double?) if needed select p; foreach (var page in pages) { DataManager.AddPageToDocument(page, item.Value); } } Console.WriteLine("Done!"); Console.Read(); }</code>
Cette approche conserve la conversion de chaîne dans la requête de base de données, améliorant ainsi l'efficacité et évitant les erreurs de traduction. Notez que SqlFunctions.StringConvert
nécessite souvent de convertir le champ de la base de données en un type approprié (par exemple, (double?)p.Serial
si p.Serial
est un type numérique). Ajustez la distribution si nécessaire pour qu'elle corresponde au schéma de votre base de données. Cette méthode est généralement préférée pour de meilleures performances et un code plus propre.
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!