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>
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>
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!