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
Susan Sarandonoriginal
2025-01-18 15:26:18331parcourir

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>

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>

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>

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!

Déclaration:
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