我正在寻找一个查询来根据发票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(十进制) - 第二条记录没有付款,并显示为空(十进制)。
答案 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组成。我认为您遇到的问题是因为您尝试将总和作为子查询执行。