C# LINQ to Sql,无法对包含聚合或子查询的表达式执行聚合函数 私有十进制GetBankAccountCashierTotal() { var company=_context.company.FirstOrDefault(); return\u context.PersonBankAgencyAccount 其中(p=>p.PersonID.Equals(company.PersonID)) .其中(c=>c.BankAgencyAccountBalance .任何(b=>b.参考x.银行代理账户余额 .其中(d=>d.Reference.Date d.Reference) .FirstOrDefault() (当前余额) .sum(); }
这是我的完整方法,在调用此方法时,我得到一个异常 Microsoft.EntityFrameworkCore.dll中发生“System.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理 和输出 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler:错误:在迭代查询结果时,数据库中发生异常。 System.Data.SqlClient.SqlException:无法对包含聚合或子查询的表达式执行聚合函数C# LINQ to Sql,无法对包含聚合或子查询的表达式执行聚合函数 私有十进制GetBankAccountCashierTotal() { var company=_context.company.FirstOrDefault(); return\u context.PersonBankAgencyAccount 其中(p=>p.PersonID.Equals(company.PersonID)) .其中(c=>c.BankAgencyAccountBalance .任何(b=>b.参考x.银行代理账户余额 .其中(d=>d.Reference.Date d.Reference) .FirstOrDefault() (当前余额) .sum(); },c#,entity-framework-core,asp.net-core-1.0,C#,Entity Framework Core,Asp.net Core 1.0,这是我的完整方法,在调用此方法时,我得到一个异常 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\u context.PersonBankAgencyAccount
其中(p=>p.PersonID.Equals(company.PersonID))
.SelectMany(p=>\u context.bankagency账户余额
其中(b=>b.AccountId==p.Id&&b.Reference.Date b.Reference)
(一)
.总和(b=>b.当前余额);
当然,由于使用导航属性不起作用,我猜了一些名称,如果需要,您可以将它们替换为您的名称。非常感谢,它工作得很好,但我仍然有一个问题,Microsoft是否允许我在包含子查询的查询中执行此类查询,或者这是由于数据库不接受此类查询而产生的问题正如我在文章中提到的,这是当前EF核心的限制/错误/不正确的SQL翻译。例如,EF6在翻译此类查询(以及其他许多查询)时没有问题。此代码的问题是它正在将信息加载到数据库中,我可能必须等待Microsoft优化EFCore翻译);这在EF Core 2.0.0-preview1中。
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();
}
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);