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.“
UrsacheDas 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
Geänderte Abfrage
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>
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!