LINQ 查詢錯誤:「無法建立類型為 API.Models.PersonProtocol 的常數值。此上下文中僅支援原始類型或枚舉類型」
本文將解決一個 LINQ 查詢中出現的錯誤,該錯誤源自於嘗試在 SELECT 子句中建立類型為 API.Models.PersonProtocol 的常數值。此上下文中僅允許原始類型或枚舉類型作為常數。
問題出在以下程式碼行:
<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>
此處,ppCombined
是一個記憶體中的 PersonProtocolType
物件集合。它無法直接與從資料庫檢索到的資料進行連接。
解
為了解決此錯誤,需要將 ppCombined
的過濾和映射操作移到 SELECT 子句之外。以下是修改後的程式碼:
<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>
在這個修改後的查詢中,ppCombined
集合首先在記憶體中進行過濾和映射,得到所需的 PersonProtocol
物件。然後,結果被賦值給 PersonDTO
物件的 personProtocol
屬性。 將對 ppCombined
的處理移至 AsEnumerable()
之後,避免了在資料庫查詢中使用記憶體集合。 AsEnumerable()
將資料庫查詢結果轉換為記憶體集合,之後的操作都在記憶體中進行,從而解決了原始錯誤。
以上是為什麼我的 LINQ 查詢失敗並顯示「無法建立類型的常數值...」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!