首頁 > 後端開發 > C++ > 為什麼使用記憶體中集合時我的 LINQ JOIN 失敗?

為什麼使用記憶體中集合時我的 LINQ JOIN 失敗?

Barbara Streisand
發布: 2025-01-17 23:41:12
原創
812 人瀏覽過

Why Does My LINQ JOIN Fail When Using an In-Memory Collection?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板