查詢過程中出現異常:「無法建立類型 API.Models.PersonProtocol 的常數值。此上下文中僅支援基本型別或枚舉型別。」
查詢嘗試在另一個 JOIN 的 SELECT 子句中使用 LINQ JOIN。但是,這種方法會失敗,因為 ppCombined(PersonProtocolType 的 IEnumerable 物件)不能用作常數值類型。
具體問題在於 ppCombined 集合表示記憶體中的數據,而查詢針對資料庫中的資料執行。無法組合這兩組數據。
為了解決這個問題,請在使用中間結果從資料庫檢索其他屬性後,從記憶體中的 ppCombined 中提取過濾後的項目。
取代原始查詢,可以使用以下修改後的方法:
<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>
AsEnumerable()
方法確保資料庫查詢在繼續進行記憶體中查詢之前完成。這樣就可以在檢索資料庫資料後,在記憶體中過濾投影 ppCombined 集合。
以上是為什麼在 SELECT 子句中使用非基本型別連接時,我的 LINQ 查詢會失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!