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>
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>
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>
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!