Dal*_*ser 0 c# asp.net entity-framework
我有开发人员写的这段代码.我觉得它太可怕而且不一定是必要的
value = s.Businesses.SelectMany(
x => x.Payments.Where(
w => w.total != 0 &&
!w.jobId.HasValue &&
w.createdAt >= Utility.monthS
&& w.createdAt <= Utility.monthE)
).Any() ?
s.Businesses.SelectMany(
x => x.Payments.Where(
w => w.total != 0 &&
!w.jobId.HasValue &&
w.createdAt >= Utility.monthS
&& w.createdAt <= Utility.monthE)
).Sum(su => su.quantity)
: 0;
Run Code Online (Sandbox Code Playgroud)
它.Any之前执行的原因Sum是没有值的记录最终得到空值并导致错误.
有没有更好的最佳实践方式来写这篇文章.
如果这不适用于Entity Framework,那么Sum只需为空集合返回0,您就不需要这样做了Any
value = s.Businesses.SelectMany(
x => x.Payments.Where(
w => w.total != 0 &&
!w.jobId.HasValue &&
w.createdAt >= Utility.monthS &&
w.createdAt <= Utility.monthE))
.Sum(su => su.quantity);
Run Code Online (Sandbox Code Playgroud)
但是,由于这是针对实体框架的,因此您遇到了将其转换为SQL的问题,并且SUM在T-SQL中将返回null空集.因此,您必须使用以下其中一项替换最后一行才能使其正常工作
.Sum(su => (int?)su.quanity) ?? 0;
Run Code Online (Sandbox Code Playgroud)
要么
.Select(su => su.quanity).DefaultIfEmpty().Sum();
Run Code Online (Sandbox Code Playgroud)
第一个将告诉C#期望可能null,如果是,则使用0 null.第二个将使用具有单个默认值的集合替换空结果,在本例中为0.
您不想这样做Any,Sum因为这会导致两次调用DB.
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |