簡體   English   中英

EF Core 3.1 擁有對象的屬性總和失敗

[英]EF Core 3.1 Sum of owned object's properties is failing

它在 2.1 中有效,但在 3.1 中開始失敗

System.InvalidCastException: 'Unable to cast object of type 'System.Linq.Expressions.NewExpression' to type 'System.Linq.Expressions.MethodCallExpression'.'
var ordersCounts = await ordersCountsQuery 
       .Select(x => new TransactionDTO
       {
            Value = new MoneyDTO(ordersCountsQuery.Sum(a => a.TotalPrice.Amount)) // worked perfectly on 2.1
       })
       .FirstOrDefaultAsync();

a.TotalPrice.Amount在 Sql 服務器數據庫上為decimal

在 EF Core 2.1 我已經設置了

.ConfigureWarnings(warnings => warnings.Throw(RelationalEventId.QueryClientEvaluationWarning))

看起來您可能在實體框架的 2.2 和 3.0 版本之間遇到了這種重大變化:

https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/break-changes#linq-queries-are-no-longer-evaluated-on-the-客戶

舊行為

在 3.0 之前,當 EF Core 無法將作為查詢一部分的表達式轉換為 SQL 或參數時,它會自動在客戶端上計算表達式。 默認情況下,客戶端對可能昂貴的表達式的評估只會觸發警告。

新行為

從 3.0 開始,EF Core 僅允許在客戶端評估頂級投影(查詢中的最后一個 Select() 調用)中的表達式。 當查詢的任何其他部分中的表達式無法轉換為 SQL 或參數時,將引發異常。

如果是這種情況,您必須重新編寫查詢以適應(這可能必須是兩個單獨的查詢)。


我會注意到您的查詢結構似乎有點奇怪:

var ordersCounts = await ordersCountsQuery 
   .Select(x => new TransactionDTO
   {
        Value = new MoneyDTO(ordersCountsQuery.Sum(a => a.TotalPrice.Amount)) // worked perfectly on 2.1
   })
   .FirstOrDefaultAsync();

獲取 MoneyDTO 列表(查詢中的每個項目一個),每個列表包含總列表和第一個 select 的總和。

以下將執行相同的操作,並且可能會稍微提高性能(僅返回一個值:

var totalPrice = ordersCountsQuery.Sum(a => a.TotalPrice.Amount);

var orderCounts = new TransactionDTO
{
    Value = new MoneyDTO(totalPrice) 
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM