Heim > Backend-Entwicklung > C++ > Warum schlägt mein LINQ JOIN fehl, wenn ich eine In-Memory-Sammlung verwende?

Warum schlägt mein LINQ JOIN fehl, wenn ich eine In-Memory-Sammlung verwende?

Barbara Streisand
Freigeben: 2025-01-17 23:41:12
Original
812 Leute haben es durchsucht

Why Does My LINQ JOIN Fail When Using an In-Memory Collection?

Fehlerbehebung bei LINQ-Joins und In-Memory-Sammlungen

Der Fehler „Konstanter Wert vom Typ kann nicht erstellt werden... In diesem Kontext werden nur primitive Typen oder Aufzählungstypen unterstützt“ erscheint häufig, wenn versucht wird, eine In-Memory-Sammlung (wie ppCombined in diesem Beispiel) direkt einzubinden in eine Datenbank-LINQ-Abfrage. Dies liegt daran, dass Datenbankabfragen ausschließlich auf datenbankresidenten Daten basieren. Die Verknüpfung mit In-Memory-Daten wird nicht direkt unterstützt.

Das Problem manifestiert sich typischerweise in der Select-Klausel der Join-Anweisung. Der Versuch, ein PersonDTO-Objekt zu erstellen, einschließlich einer aus der In-Memory-Sammlung gefüllten Eigenschaft, verursacht den Konflikt.

Die Hauptursache für den LINQ JOIN-Fehler

Der Fehler entsteht durch den Versuch, einen Filtervorgang (Where-Klausel) für die ppCombined-Sammlung innerhalb der Select-Anweisung der Datenbankabfrage durchzuführen. Die Datenbank-Engine kann diesen In-Memory-Vorgang nicht in sein eigenes Äquivalent übersetzen.

Lösung: Separate Datenbank- und In-Memory-Operationen

Die Lösung besteht darin, die Datenbankabfrage von der In-Memory-Verarbeitung zu trennen. Dazu gehört zunächst die Ausführung der Datenbankabfrage und anschließend die Filterung und Datenbearbeitung des resultierenden In-Memory-Datensatzes. Die AsEnumerable()-Methode ist hier der Schlüssel. Es erzwingt die Ausführung der Datenbankabfrage und gibt die Ergebnisse als IEnumerable-Objekt zurück, sodass nachfolgende Vorgänge vollständig im Speicher ausgeführt werden können.

Hier ist der korrigierte Code:

<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 {
            personId = p.personId,
            addressId = p.addressId,
            favoriteId = f.favoriteId
        })
    .AsEnumerable() // Database query completes here
    .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>
Nach dem Login kopieren

Durch die Verwendung von AsEnumerable() wird die Datenbankabfrage abgeschlossen und die nachfolgende Select-Anweisung arbeitet ausschließlich mit den aus der Datenbank abgerufenen Daten, wodurch die Inkompatibilität mit der speicherinternen ppCombined-Sammlung behoben wird. Dadurch wird sichergestellt, dass die Abfrage erfolgreich ausgeführt wird.

Das obige ist der detaillierte Inhalt vonWarum schlägt mein LINQ JOIN fehl, wenn ich eine In-Memory-Sammlung verwende?. 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