首頁 > 後端開發 > C++ > 如何解決加入記憶體集合的 LINQ 查詢中的「無法建立常數值」錯誤?

如何解決加入記憶體集合的 LINQ 查詢中的「無法建立常數值」錯誤?

DDD
發布: 2025-01-17 23:34:09
原創
944 人瀏覽過

How to Resolve

使用記憶體資料解決 LINQ 查詢中的「持續建立失敗」問題

挑戰:

LINQ 查詢失敗,產生錯誤「無法建立API.Models.PersonProtocol 類型的常數值。此上下文中僅支援原始類型或枚舉類型。」這是在資料庫記錄和記憶體集合(名為ppCombined)之間的聯接操作期間發生的。

理解錯誤:

出現此錯誤的原因是 LINQ to Entities(或類似的 ORM)無法直接將涉及記憶體中集合的聯接轉換為 SQL。 兩個資料集都需要駐留在資料庫中,以便連線能夠在資料庫中有效執行。

解:兩階段方法

解決方案涉及將資料庫查詢與記憶體處理分開。 首先,從資料庫中檢索必要的數據,然後在單獨的記憶體操作中與記憶體集合執行連接:

<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 // anonymous object
        {
            personId = p.personId,
            addressId = p.addressId,   
            favoriteId = f.favoriteId,
        })
    .AsEnumerable() // Crucial: This line switches to in-memory processing
    .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 查詢中的「無法建立常數值」錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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