使用記憶體資料解決 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中文網其他相關文章!