Beheben von „Ständigen Erstellungsfehlern“ in LINQ-Abfragen mithilfe von In-Memory-Daten
Die Herausforderung:
Eine LINQ-Abfrage ist fehlgeschlagen und hat den Fehler „Es konnte kein konstanter Wert vom Typ API.Models.PersonProtocol erstellt werden. In diesem Kontext werden nur primitive Typen oder Aufzählungstypen unterstützt“ generiert. Dies geschah während eines Verknüpfungsvorgangs zwischen Datenbankdatensätzen und einer In-Memory-Sammlung (mit dem Namen ppCombined
).
Den Fehler verstehen:
Dieser Fehler tritt auf, weil LINQ to Entities (oder ein ähnliches ORM) Verknüpfungen mit In-Memory-Sammlungen nicht direkt in SQL übersetzen kann. Beide Datensätze müssen datenbankresident sein, damit die Verknüpfung effizient innerhalb der Datenbank ausgeführt werden kann.
Die Lösung: Ein zweistufiger Ansatz
Die Lösung besteht darin, die Datenbankabfrage von der In-Memory-Verarbeitung zu trennen. Rufen Sie zunächst die erforderlichen Daten aus der Datenbank ab und führen Sie dann die Verknüpfung mit der In-Memory-Sammlung in einem separaten In-Memory-Vorgang durch:
<code class="language-csharp">var persons = db.Favorites .Where(f => f.userId == userId) .Join(db.Person, f => f.personId, p => p.personId, (f, p) => new // anonymous object { personId = p.personId, addressId = p.addressId, favoriteId = f.favoriteId, }) .AsEnumerable() // Crucial: This line switches to in-memory processing .Select(x => new PersonDTO { personId = x.personId, addressId = x.addressId, favoriteId = x.favoriteId, personProtocol = ppCombined .Where(p => p.personId == x.personId) .Select(p => new PersonProtocol { personProtocolId = p.personProtocolId, activateDt = p.activateDt, personId = p.personId }) .ToList() });</code>
Die AsEnumerable()
Methode ist der Schlüssel. Es erzwingt die Ausführung der Datenbankabfrage und gibt eine Sammlung im Speicher zurück. Die nachfolgende Select
-Anweisung verarbeitet dann diese In-Memory-Daten und verknüpft sie effizient mit ppCombined
im Speicher der Anwendung. Dadurch werden die Einschränkungen umgangen, die mit dem Versuch einhergehen, den Join direkt im Datenbankkontext durchzuführen.
Das obige ist der detaillierte Inhalt vonWie behebe ich den Fehler „Es kann kein konstanter Wert erstellt werden' in LINQ-Abfragen, die In-Memory-Sammlungen verknüpfen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!