LINQ 連線與記憶體集合故障排除
嘗試直接合併記憶體中集合(如本例中的ppCombined
)時,經常會出現錯誤「無法建立類型的常數值...在此上下文中僅支援原始型別或枚舉型別」轉換為資料庫LINQ 查詢。 這是因為資料庫查詢僅對資料庫駐留資料進行操作; 不直接支援與記憶體資料連接。
問題通常出現在 Select
語句的 Join
子句中。 嘗試建立 PersonDTO
物件(包括從記憶體集合填充的屬性)會導致衝突。
LINQ JOIN 失敗的根本原因
該錯誤是由於嘗試在資料庫查詢的 Where
語句內的 ppCombined
集合 上執行過濾操作( 子句)而引起的。 資料庫引擎無法將此記憶體中操作轉換為其自身的等效操作。 Select
解決方案:將資料庫和記憶體操作分開
解決方案是將資料庫查詢與記憶體處理分開。 這涉及首先執行資料庫查詢,然後對生成的記憶體資料集執行過濾和資料操作。 方法是這裡的關鍵。 它強制執行資料庫查詢,將結果作為 AsEnumerable()
物件傳回,允許後續操作完全在記憶體中進行。 IEnumerable
<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() // Database query completes here .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()
語句只對從資料庫中檢索到的資料進行操作,解決了與記憶體中Select
集合的不相容問題。 這可確保查詢成功執行。 ppCombined
以上是為什麼使用記憶體中集合時我的 LINQ JOIN 失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!