Heim > Backend-Entwicklung > C++ > Warum schlägt meine LINQ-Abfrage mit der Meldung „Es konnte kein konstanter Wert vom Typ erstellt werden …' fehl?

Warum schlägt meine LINQ-Abfrage mit der Meldung „Es konnte kein konstanter Wert vom Typ erstellt werden …' fehl?

Linda Hamilton
Freigeben: 2025-01-17 23:21:11
Original
113 Leute haben es durchsucht

Why Does My LINQ Query Fail with

LINQ-Abfragefehler: „Es kann kein konstanter Wert vom Typ API.Models.PersonProtocol erstellt werden. In diesem Kontext werden nur primitive oder aufgezählte Typen unterstützt“

In diesem Artikel wird ein Fehler in einer LINQ-Abfrage behoben, der durch den Versuch verursacht wurde, einen konstanten Wert vom Typ API.Models.PersonProtocol in einer SELECT-Klausel zu erstellen. Als Konstanten sind in diesem Kontext nur primitive oder aufgezählte Typen zulässig.

Das Problem liegt in der folgenden Codezeile:

<code class="language-csharp">personProtocol = (ICollection<personprotocol>) ppCombined
    .Where(a => a.personId == x.personId)
    .Select( b => new PersonProtocol()
     {
         personProtocolId = b.personProtocolId,
         activateDt = b.activateDt,
         personId = b.personId
     })</code>
Nach dem Login kopieren

Hier ist ppCombined eine Sammlung von PersonProtocolType Objekten im Speicher. Es kann keine direkte Verbindung mit aus der Datenbank abgerufenen Daten hergestellt werden.

Lösung

Um diesen Fehler zu beheben, müssen die Filter- und Zuordnungsvorgänge von ppCombined außerhalb der SELECT-Klausel verschoben werden. Das Folgende ist der geänderte 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() // 数据库查询在此结束,其余部分是内存中的查询
    .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

In dieser modifizierten Abfrage wird die ppCombined-Sammlung zunächst gefiltert und im Speicher zugeordnet, um die erforderlichen PersonProtocol-Objekte zu erhalten. Das Ergebnis wird dann der Eigenschaft PersonDTO des personProtocol-Objekts zugewiesen. Vermeiden Sie die Verwendung von In-Memory-Sammlungen in Datenbankabfragen, indem Sie die Verarbeitung von ppCombined nach AsEnumerable() verschieben. AsEnumerable() Konvertieren Sie die Datenbankabfrageergebnisse in eine Speichersammlung, und alle nachfolgenden Vorgänge werden im Speicher ausgeführt, wodurch der ursprüngliche Fehler behoben wird.

Das obige ist der detaillierte Inhalt vonWarum schlägt meine LINQ-Abfrage mit der Meldung „Es konnte kein konstanter Wert vom Typ erstellt werden …' fehl?. 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