在使用 Entity Framework 和復合主鍵時,實現與簡單 Contains() 查詢相同的功能變得更加複雜。本文探討解決此問題的各種方法:
嘗試使用表示複合主鍵值的元組進行直接連接或 Contains 操作在 Entity Framework 中會失敗。這是因為無法將此類操作轉換為 SQL,因為在此上下文中元組不被視為原始值。
另一種方法是使用 AsEnumerable() 將數據庫表數據提取到內存中,並使用 LINQ to Objects 執行必要的篩選。但是,對於大型表,此解決方案效率極低。
對每個複合主鍵組件使用單獨的 Contains() 語句會導致篩選不正確。這種方法會產生誤導性結果,因為只包含一個匹配組件的實體會被錯誤地包含在內。
可以使用包含從復合主鍵組件派生的計算值的修改後的 Contains() 查詢(例如,entity.Id1 * entity.Id2)。但是,此解決方案是非可搜索的,導致性能低下。
最可擴展的方法是結合 Contains 和內存連接。此方法使用初步的 Contains() 查詢來縮小結果集,然後通過內存連接進行更精確的細化。
像 Linqkit 這樣的謂詞構建器允許創建包含每個複合主鍵值組合的 OR 子句的查詢。雖然此方法可能適用於小型列表,但對於大型列表,其性能會下降。
另一種方法是使用 UNION 將每個複合主鍵值組合的多個查詢組合起來。此解決方案對於小型到中等大小的列表可能有效。
以上是如何在實體框架中使用複合密鑰有效查詢實體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!