實體框架核心:LINQ對實體的投影限制查詢
使用實體框架核心時,直接在LINQ投影到實體查詢中直接構造實體對象通常會導致錯誤:“實體或複雜類型不能在LINQ中構造到實體查詢中。”
>。問題:
考慮此示例:
<code class="language-csharp">public IQueryable<Product> GetProducts(int categoryID) { return from p in db.Products where p.CategoryID == categoryID select new Product { Name = p.Name }; }</code>
用productRepository.GetProducts(1).ToList();
執行此操作將失敗。
>為什麼失敗:
問題源於實體框架核心將LINQ查詢轉換為數據庫命令的事實。數據庫服務器缺乏對應用程序Product
類及其構造函數的了解。 因此,它不能創建此類的實例。
>解決方案:項目匿名類型或DTOS
>解決方案是將查詢結果投影到匿名類型或專用數據傳輸對象(DTOS)中。
方法1:使用匿名類型
這是用於較小查詢的快速而簡單的解決方案:>
<code class="language-csharp">var products = (from p in db.Products where p.CategoryID == categoryID select new { Name = p.Name }).ToList();</code>
方法2:採用數據傳輸對象(DTOS)>
對於更複雜的方案或需要強大的對象時,請創建一個DTO:通過投影到匿名類型或DTO,您可以規避數據庫實例化您的實體類,確保成功的查詢執行。
以上是為什麼在LINQ中構建實體對實體的預測會引發錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!