LINQ to Entities: Behebung der Ausnahme „Methode nicht erkannt“
Datenbankmigration führt häufig zu Problemen bei der Methodenerkennung. Ein häufiger Fehler ist:
„LINQ to Entities erkennt die Methode ‚System.String ToString()‘ nicht und diese Methode kann nicht in einen Speicherausdruck übersetzt werden.“
Dies passiert normalerweise, wenn eine String-Eigenschaft mit einem String-Ausdruck verglichen wird, etwa so:
<code>IQueryable<entity> pages = from p in context.pages where p.Serial == item.Key.ToString() select p;</code>
Die Grundursache verstehen:
Die Methode ToString()
wird nicht direkt ausgeführt, sondern als MethodGroup behandelt. LINQ versucht, diese Gruppe in einen entsprechenden SQL-Ausdruck zu übersetzen. Fehlt in der Zieldatenbank ein direktes ToString()
-Äquivalent, schlägt die Übersetzung fehl.
Lösung: Vorabspeicherung des String-Werts:
Die einfachste Lösung besteht darin, das String-Ergebnis vor dem Vergleich in einer Variablen zu speichern:
<code>string strItem = item.Key.ToString(); IQueryable<entity> pages = from p in context.pages where p.Serial == strItem select p;</code>
Dadurch wird der ToString()
-Aufruf aus der Abfrage entfernt und der Übersetzungsfehler verhindert.
Alternative: Nutzung von SqlFunctions:
Die Hilfsklasse SqlFunctions
bietet datenbankspezifische Funktionen für LINQ to Entities-Abfragen. Für ToString()
können Sie Folgendes versuchen:
<code>IQueryable<entity> pages = from p in context.pages where SqlFunctions.StringConvert((decimal?)p.Serial) == item.Key select p;</code>
Beachten Sie die Umwandlung in (decimal?)
, die abhängig vom zugrunde liegenden Datenbanktyp von p.Serial
häufig erforderlich ist. SqlFunctions
kann Code rationalisieren und temporäre Variablen vermeiden, erfordert jedoch eine sorgfältige Berücksichtigung der Datentypen.
Das obige ist der detaillierte Inhalt vonWarum löst LINQ to Entities bei der Verwendung von ToString() die Ausnahme „Methode nicht erkannt' aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!