Heim > Datenbank > MySQL-Tutorial > Warum löst LINQ to Entities eine „System.String ToString()'-Ausnahme aus und wie kann ich das beheben?

Warum löst LINQ to Entities eine „System.String ToString()'-Ausnahme aus und wie kann ich das beheben?

Susan Sarandon
Freigeben: 2025-01-18 15:26:18
Original
324 Leute haben es durchsucht

Why Does LINQ to Entities Throw a

LINQ to Entities: Fehlerbehebung für den Fehler „System.String ToString()“

Wenn Sie mit LINQ to Entities (LINQ2E) arbeiten, um Daten in einer relationalen Datenbank abzufragen und zu bearbeiten, kann der Fehler auftreten: „LINQ to Entities erkennt die Methode ‚System.String ToString()‘ und diese Methode nicht.“ kann nicht in einen Geschäftsausdruck übersetzt werden.“ Dies geschieht, wenn ein LINQ-Ausdruck die ToString()-Methode für eine Zeichenfolge auf eine Weise verwendet, die nicht direkt in ein SQL-Äquivalent konvertiert werden kann.

Lassen Sie uns dieses Szenario untersuchen:

<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>
Nach dem Login kopieren

Hier wird ToString() für item.Key (eine Zeichenfolge) innerhalb der where-Klausel aufgerufen. LINQ2E hat Schwierigkeiten, dies in SQL zu übersetzen, da ToString() kein direktes SQL-Gegenstück vorhanden ist.

Lösungen für das Problem

Die einfachste Lösung besteht darin, den String-Wert vorab einer Variablen zuzuweisen:

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

IQueryable<entity> pages = from p in context.pages
                           where p.Serial == strItem
                           select p;</code>
Nach dem Login kopieren

Dies funktioniert, weil LINQ2E strItem jetzt als Konstante betrachtet, sodass keine Übersetzung erforderlich ist.

Eine alternative Lösung (EF Core 2.1 und höher):

EF Core 2.1 und spätere Versionen bieten die SqlFunctions-Hilfsklasse, die eine StringConvert-Methode speziell für LINQ2E-Ausdrücke bereitstellt:

<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>
Nach dem Login kopieren

Die Verwendung einer der beiden Methoden löst die Ausnahme „System.String ToString()“ auf und stellt sicher, dass Ihre LINQ2E-Abfragen korrekt ausgeführt werden. Denken Sie daran, potenzielle Nullwerte angemessen zu behandeln, wie die (double?)-Umwandlung im SqlFunctions-Beispiel zeigt. Dies ist häufig aus Gründen der Datenbankkompatibilität erforderlich.

Das obige ist der detaillierte Inhalt vonWarum löst LINQ to Entities eine „System.String ToString()'-Ausnahme aus und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage