null-coalescing operator ??在LINQ中抛出错误

时间:2017-06-18 03:45:53

标签: c# linq asp.net-core entity-framework-core

使用null-coalescing operator ??时,LINQ次查询后会抛出错误,如下所示。如果删除?? 0部分,它可以正常工作。但是如果t.cost为空,我需要显示0。我试图提出LINQ等效的T-SQL IsNull(...)方法,如下所示。

T-SQL:

SELECT IsNuLL(cost,0) from Orders Where OrdId = 123

LINQ:

float? fCost = _context.Orders.Where(r => r.OrdId == 123).Select(t => t.cost ?? 0).SingleOrDefault();

LINQ错误:

Unable to cast object of type `'System.Double' to type 'System.Single`

注意:

VS2015识别语法....Select(t => t.cost ?? 0)....并且编译良好但在运行时抛出错误。此外;它还识别语法....Select(t => (t.cost ?? 0))....,但会在其上引发相同的错误。

2 个答案:

答案 0 :(得分:1)

您当前的疑问:

Single? cost = _context
    .Orders
    .Where( r => r.OrdId == 123 )
    .Select( t => t.cost ?? 0 )
    .SingleOrDefault();

可以改写为:

Single? cost = _context.
    .Orders
    .SingleOrDefault( r => r.OrdId == 123 )
    ?.Cost;
如果没有行costnull(SQL NULL),则

r.OrderId == 123将为r.Cost IS NULL。请注意我在?.之前使用.Cost运算符。

答案 1 :(得分:0)

试试这个。

float? fCost = _context.Orders.Where(r => r.OrdId == 123).Select(t => new { cost = (t.cost == DBNull.value ? 0 : t.cost) }).SingleOrDefault();