首頁 > 後端開發 > C++ > 為什麼在 SELECT 子句中使用非基本型別連接時,我的 LINQ 查詢會失敗?

為什麼在 SELECT 子句中使用非基本型別連接時,我的 LINQ 查詢會失敗?

Mary-Kate Olsen
發布: 2025-01-17 23:26:09
原創
262 人瀏覽過

Why Does My LINQ Query Fail When Joining with a Non-Primitive Type in the SELECT Clause?

無法為非基本型別或枚舉型別建立常數值

問題描述

查詢過程中出現異常:「無法建立類型 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中文網其他相關文章!

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