Warum kann Entity Framework ToString () in einer LINQ-Anweisung nicht verwenden?

c# entity-framework linq linq-to-sql

Frage

Dies funktioniert in LINQ-to-SQL:

var customersTest = from c in db.Customers
                select new
                {
                    Id = c.Id,
                    Addresses = from a in db.Addresses where c.Id.ToString() == 
                        a.ReferenzId select a
                };

foreach (var item in customersTest)
{
    Console.WriteLine(item.Id);
}

In einem ähnlichen Beispiel in Entity Framework wird jedoch eine Fehlermeldung angezeigt , die besagt, dass es "nicht in SQL übersetzt werden kann". Hier ist die ursprüngliche Fehlermeldung in deutscher Sprache:

"'LINQ to Entities' erkennt die Methode 'System.String ToString ()' nicht, und diese Methode kann nicht in einen Speicherausdruck übersetzt werden."

Übersetzung:

"'LINQ to Entities' erkennt die Methode 'System.String ToString ()' nicht. Diese Methode kann nicht in einen Speicherausdruck übersetzt werden.

Kann jemand ein Licht darauf werfen, wie wir diese Art von Anweisung in Entity Framework zum Laufen bringen oder erklären können, warum es diesen Fehler bekommt?

Beliebte Antwort

Einfach ausgedrückt: LINQ to Entities kennt die Konvertierung von Ihrem ID-Typ in einen String nicht.

Was ist der Typ von c.ID ? Gibt es einen Grund, warum es sich um einen ID-Typ handelt, aber um einen anderen für ReferenzId ? Wenn überhaupt möglich, machen Sie den gleichen Typ, an dem Sie kein Problem mehr haben. Ich weiß nicht, ob es andere Möglichkeiten gibt, Konvertierungen in LINQ in Entities durchzuführen - es gibt vielleicht eine, aber das Ausrichten der Typen wäre sauberer.

Übrigens sieht das wirklich so aus, als wäre es ein Join:

var query = from c in db.Customers
            join a in db.Addresses on c.Id equals a.ReferenzId into addresses
            select new { Id = c.Id, Addresses = addresses };

BEARBEITEN: Um auf Ihren Kommentar zu antworten - ToString in IntelliSense ToString , da der Compiler keine Ahnung hat, was Ihre Abfrage bedeutet oder wie sie übersetzt wird. Es ist vollkommen gültig C # und kann einen gültigen Ausdrucksbaum generieren - es ist nur so, dass EF nicht weiß, wie er diesen Ausdrucksbaum in SQL konvertieren soll.

Sie können versuchen , Convert.ToString(c.Id) anstatt nur c.Id.ToString()



Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow