Maison > base de données > tutoriel mysql > Pourquoi LINQ to Entities lève-t-il une exception « System.String ToString() » et comment puis-je la corriger ?

Pourquoi LINQ to Entities lève-t-il une exception « System.String ToString() » et comment puis-je la corriger ?

Susan Sarandon
Libérer: 2025-01-18 15:26:18
original
390 Les gens l'ont consulté

Why Does LINQ to Entities Throw a

LINQ to Entities : Dépannage de l'erreur « System.String ToString() »

Lorsque vous travaillez avec LINQ to Entities (LINQ2E) pour interroger et manipuler des données dans une base de données relationnelle, vous pouvez rencontrer l'erreur : "LINQ to Entities ne reconnaît pas la méthode 'System.String ToString()', et cette méthode ne peut pas être traduit dans une expression de magasin." Cela se produit lorsqu'une expression LINQ utilise la méthode ToString() sur une chaîne d'une manière qui ne peut pas être directement convertie en équivalent SQL.

Examinons ce scénario :

<code class="language-C#">using (var context = new Context())
{
    // ...

    foreach (var item in collection)
    {
        IQueryable<entity> pages = from p in context.pages
                                   where p.Serial == item.Key.ToString()
                                   select p;
        foreach (var page in pages)
        {
            DataManager.AddPageToDocument(page, item.Value);
        }
    }

    Console.WriteLine("Done!");
    Console.Read();
}</code>
Copier après la connexion

Ici, ToString() est appelé sur item.Key (une chaîne) dans la clause where. LINQ2E a du mal à traduire cela en SQL car ToString() n'a pas d'équivalent SQL direct.

Solutions au problème

La solution la plus simple consiste à pré-attribuer la valeur de chaîne à une variable :

<code class="language-C#">var strItem = item.Key.ToString();

IQueryable<entity> pages = from p in context.pages
                           where p.Serial == strItem
                           select p;</code>
Copier après la connexion

Cela fonctionne parce que LINQ2E considère désormais strItem comme une constante, éliminant ainsi le besoin de traduction.

Une solution alternative (EF Core 2.1 et versions ultérieures) :

EF Core 2.1 et les versions ultérieures proposent la classe d'assistance SqlFunctions, fournissant une méthode StringConvert spécifiquement pour les expressions LINQ2E :

<code class="language-C#">IQueryable<entity> pages = from p in context.pages
                           where p.Serial == SqlFunctions.StringConvert((double?)item.Key) // Note the cast to (double?)
                           select p;</code>
Copier après la connexion

L'utilisation de l'une ou l'autre méthode résout l'exception "System.String ToString()" et garantit que vos requêtes LINQ2E s'exécutent correctement. N'oubliez pas de gérer les valeurs nulles potentielles de manière appropriée, comme le montre le cast (double?) dans l'exemple SqlFunctions. Ceci est souvent nécessaire pour la compatibilité des bases 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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal