Heim > Backend-Entwicklung > C++ > Warum schlägt meine LINQ-Abfrage fehl, wenn sie mit einem nicht-primitiven Typ in der SELECT-Klausel verknüpft wird?

Warum schlägt meine LINQ-Abfrage fehl, wenn sie mit einem nicht-primitiven Typ in der SELECT-Klausel verknüpft wird?

Mary-Kate Olsen
Freigeben: 2025-01-17 23:26:09
Original
262 Leute haben es durchsucht

Why Does My LINQ Query Fail When Joining with a Non-Primitive Type in the SELECT Clause?

Kann keine konstanten Werte für Nicht-Basis- oder Enum-Typen erstellen

Problembeschreibung

Ausnahme während der Abfrage: „Es kann kein konstanter Wert vom Typ API.Models.PersonProtocol erstellt werden. In diesem Kontext werden nur primitive oder aufgezählte Typen unterstützt.“

Ursache

Die Abfrage hat versucht, einen LINQ JOIN innerhalb der SELECT-Klausel eines anderen JOIN zu verwenden. Dieser Ansatz schlägt jedoch fehl, da ppCombined (ein IEnumerable-Objekt von PersonProtocolType) nicht als konstanter Werttyp verwendet werden kann.

Das spezifische Problem besteht darin, dass die ppCombined-Sammlung Daten im Speicher darstellt, während die Abfrage für die Daten in der Datenbank ausgeführt wird. Die beiden Datensätze können nicht kombiniert werden.

Lösung

Um dieses Problem zu beheben, extrahieren Sie die gefilterten Elemente aus ppCombined im Speicher, nachdem Sie die Zwischenergebnisse verwendet haben, um andere Eigenschaften aus der Datenbank abzurufen.

Geänderte Abfrage

Um die ursprüngliche Abfrage zu ersetzen, können Sie die folgende modifizierte Methode verwenden:

Die Methode
<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() // 数据库查询在此处结束,其余部分是内存中的查询
    .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

stellt sicher, dass die Datenbankabfrage abgeschlossen wird, bevor mit der In-Memory-Abfrage fortgefahren wird. Dadurch kann die ppCombined-Sammlung gefiltert und im Speicher projiziert werden, nachdem die Datenbankdaten abgerufen wurden. AsEnumerable()

Das obige ist der detaillierte Inhalt vonWarum schlägt meine LINQ-Abfrage fehl, wenn sie mit einem nicht-primitiven Typ in der SELECT-Klausel verknüpft wird?. 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