【发布时间】:2021-04-22 17:21:39
【问题描述】:
我需要将以下 sql 查询转换为带有实体框架的 C# linq:
SELECT AccNo, SUM(Debit) - SUM(Credit) AS Balance FROM TrxAffair
WHERE (TrxDate > '2021-01-01') GROUP BY AccNo
我尝试了以下方法,但我得到::'转换为值类型'System.Decimal'失败,因为物化值为空。结果类型的泛型参数或查询必须使用可为空的类型。'
部分无效 OnGetPreviousBalance(小数项);
public decimal GetPreviousBalance(DateTime trxDate)
{
var items = context.TrxAffairs
.AsQueryable()
.Where(i => i.TrxDate < trxDate)
.GroupBy(o => o.AccNo)
.Select(s => s.Sum(i=>(i.Credit-i.Debit)));
OnGetPreviousBalance(items.Sum(s=>s.Value));
return items.Sum(s => s.Value);
}
【问题讨论】:
-
在 SQL 中,您有总和的差异,而不是差异的总和。至于演员表,似乎抱怨其中一个类属性应该可以为空。您没有发布课程或表格架构,因此只能猜测。但是,如果其中一个为 null,
i.Credit -i.Debit也会导致 SQL 出现问题 -
在 SQL 和 LINQ 中比较 TrxDate 似乎是相反的
> vs < -
在 SQL 中,如果您使用
SUM(Credit - Debit),如果其中一个是null,您将得到一个 NULL。而不是 +100 或 -100,您将一无所获。使用s.Sum(i.Credit) - s.Sum(i.Debit)生成相同的SQL查询 -
AND 添加
ToList(),以避免一遍又一遍地枚举结果。并将总计存储在变量中以避免计算两次
标签: c#