LINQ to Sql,無法對包含聚合或子查詢的表達式執行聚合函數

asp.net-core-1.0 c# entity-framework-core

private decimal GetBankAccountCashierTotal()
{
    var company = _context.Company.FirstOrDefault();

    return _context.PersonBankAgencyAccount
           .Where(p => p.PersonID.Equals(company.PersonID))
           .Where(c => c.BankAgencyAccountBalance
                .Any(b => b.Reference <= DateTime.Now))
           .Select(x => x.BankAgencyAccountBalance
                .Where(d => d.Reference.Date <= DateTime.Now)
                .OrderByDescending(d => d.Reference)
                .FirstOrDefault()
                .CurrentBalance)
           .sum();
}

這是我的完整方法,在這個方法的調用中我得到了一個異常

Microsoft.EntityFrameworkCore.dll中出現“System.Data.SqlClient.SqlException”類型的異常,但未在用戶代碼中處理

和輸出

Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler:錯誤:迭代查詢結果時數據庫中發生異常。 System.Data.SqlClient.SqlException:無法對包含聚合或子查詢的表達式執行聚合函數。

一般承認的答案

好消息是問題不在你的(絕對有效的)LINQ查詢中。

壞消息是,目前(v.1.1.0)EF Core LINQ查詢翻譯/處理仍然是一場噩夢。經過大量的試驗和錯誤,從EF Core基礎架構獲取不正確的SQL(因此SQL異常)或不同的內部異常,我能夠通過單個SQL獲得所需結果的唯一(!)方式如下(必須嚴格按照這樣寫的):

return _context.PersonBankAgencyAccount
       .Where(p => p.PersonID.Equals(company.PersonID))
       .SelectMany(p => _context.BankAgencyAccountBalance
           .Where(b => b.AccountId == p.Id && b.Reference.Date <= DateTime.Now)
           .OrderByDescending(b => b.Reference)
           .Take(1))
       .Sum(b => b.CurrentBalance);

當然因​​為使用導航屬性不起作用,我猜了一些名字,如果需要你可以用你的名字替換它們。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因