Linq三元代码更好的解决方案

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是没有值的记录最终得到空值并导致错误.

有没有更好的最佳实践方式来写这篇文章.

juh*_*arr 7

如果这不适用于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.