[英]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 版本之間遇到了這種重大變化:
舊行為
在 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.