Heim > Backend-Entwicklung > C++ > Wie behebe ich den Fehler „Es kann kein konstanter Wert erstellt werden' in LINQ-Abfragen, die In-Memory-Sammlungen verknüpfen?

Wie behebe ich den Fehler „Es kann kein konstanter Wert erstellt werden' in LINQ-Abfragen, die In-Memory-Sammlungen verknüpfen?

DDD
Freigeben: 2025-01-17 23:34:09
Original
944 Leute haben es durchsucht

How to Resolve

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>
Nach dem Login kopieren

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage