在Linq to Sql中求和不返回值

时间:2013-05-24 14:28:23

标签: c# asp.net-mvc linq linq-to-sql

我正在寻找一个查询来根据发票ID返回所有付款的总和 - 但是,如果没有注明付款,则下面的查询返回null。有没有办法让它返回0而不是null?我试过加?最后为0,但收到消息Operator ?? cannot be applied to operands of type decimal and int

AmountAllocated的类型为Decimal:

public decimal AmountAllocated { get; set; }

谢谢,Mark

如果找不到付款行,则以下内容返回null:

 var invoiceVM = from i in db.Invoices
         where i.UserName==userName
         select new NewInvoiceViewModel
         {
           InvoiceId = i.InvoiceId,
           SumPayments = 
              db.PaymentInvoices.Where(pi => pi.InvoiceId == i.InvoiceId)
                                .Select(pi => pi.AmountAllocated).Sum()
                        };

以下结果导致Operator ?? cannot be applied to operands of type decimal and int错误:

  var invoiceVM = from i in db.Invoices
         where i.UserName==userName
         select new NewInvoiceViewModel
         {
           InvoiceId = i.InvoiceId,
           SumPayments = 
             db.PaymentInvoices.Where(pi => pi.InvoiceId == i.InvoiceId)
                                .Sum(pi => pi.AmountAllocated) ?? 0

                        };

如果已经付款,则AmountAllocated会正确返回这些付款的总和 - 如果找不到付款行,则返回null。

您可以从下面的屏幕截图中看到,第一条记录有付款,并且显示正确为10(十进制) - 第二条记录没有付款,并显示为空(十进制)。

screenshot

2 个答案:

答案 0 :(得分:1)

您可以尝试测试是否有任何要返回的行。

{
       InvoiceId = i.InvoiceId,
       SumPayments = 
          db.PaymentInvoices.Any(pi => pi.InvoiceId == i.InvoiceId)
          ? db.PaymentInvoices.Where(pi => pi.InvoiceId == i.InvoiceId)
                              .Select(pi => pi.AmountAllocated).Sum()
          : 0
};

另一种选择是使用SumPayments.GetValueOrDefault(),它将返回值或0。

答案 1 :(得分:0)

我相信这是因为在SQL中所有数据类型都可以为空,但在C#中则不是这样。在使用.ToList()

对其进行求和之前,请尝试强制列出付款发票
SumPayments = db.PaymentInvoices.Where(pi => pi.InvoiceId == i.InvoiceId)
                                .Select(pi => pi.AmountAllocated)
                                .ToList()
                                .Sum()

更新:尝试将查询作为从发票到PaymentInvoices的连接编写,并由InvoiceId组成。我认为您遇到的问题是因为您尝试将总和作为子查询执行。