Maison >développement back-end >C++ >Comment résoudre l'exception « LINQ to Entities ne reconnaît pas la méthode 'System.String ToString()' » ?

Comment résoudre l'exception « LINQ to Entities ne reconnaît pas la méthode 'System.String ToString()' » ?

DDD
DDDoriginal
2025-01-22 09:17:09566parcourir

How to Resolve the

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!

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