转换为值类型"Double"失败,因为实现值为null

Mat*_*att 25 c# entity-framework

码:

double cafeSales = db.InvoiceLines
    .Where(x =>
        x.UserId == user.UserId &&
        x.DateCharged >= dateStart &&
        x.DateCharged <= dateEnd)
    .Sum(x => x.Quantity * x.Price);
Run Code Online (Sandbox Code Playgroud)

错误:

转换为值类型"Double"失败,因为实现值为null.结果类型的泛型参数或查询必须使用可空类型.

我已经看到了什么:

转换为值类型"Int32"失败,因为实现值为null

转换为值类型'Decimal'失败,因为具体化值为null

我做了什么:

double cafeSales = db.InvoiceLines
    .Where(x =>
        x.UserId == user.UserId &&
        x.DateCharged >= dateStart &&
        x.DateCharged <= dateEnd)
    .DefaultIfEmpty()
    .Sum(x => x.Quantity * x.Price);
Run Code Online (Sandbox Code Playgroud)

和:

double? cafeSales = db.InvoiceLines
    .Where(x =>
        x.UserId == user.UserId &&
        x.DateCharged >= dateStart &&
        x.DateCharged <= dateEnd)
    .Sum(x => x.Quantity * x.Price);
Run Code Online (Sandbox Code Playgroud)

这些都不奏效.我知道问题的原因是该表中没有我传入的UserId中的行.在这种情况下,我更喜欢Sum()只返回0给我.有任何想法吗?

Jit*_*oli 60

最佳方案

double cafeSales = db.InvoiceLines
                     .Where(x =>
                                x.UserId == user.UserId &&
                                x.DateCharged >= dateStart &&
                                x.DateCharged <= dateEnd)
                     .Sum(x => (double?)(x.Quantity * x.Price)) ?? 0;
Run Code Online (Sandbox Code Playgroud)


Maa*_*ten 8

您可以检查集合是否有正确的结果.

double? cafeSales = null;
var invoices = db.InvoiceLines
    .Where(x =>
        x.UserId == user.UserId &&
        x.DateCharged >= dateStart &&
        x.DateCharged <= dateEnd
    )
    .Where(x => x.Quantity != null && x.Price != null);
if (invoices.Any()) {
    cafeSales = invoices.Sum(x => x.Quantity * x.Price);
}
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的问题在于,有2个查询被发送到db,第一个查询是Any()以查看是否有任何记录,第二个查询是执行实际的sum()。 (2认同)