用于从可能的null db值分配值的优雅语法

kei*_*en7 3 c#

对于某些上下文,记录类SaleAmount属性是

public decimal? SaleAmount
{
    get;
    set;
}
Run Code Online (Sandbox Code Playgroud)

理想情况下,我会这样做

record.SaleAmount.Value = 
sql.Reader.IsDBNull(IDX_SALEAMOUNT) ? null : 
    sql.Reader.GetDecimal(IDX_SALEAMOUNT);
Run Code Online (Sandbox Code Playgroud)

唉编译器,这不是朋友,因为......

无法确定条件表达式的类型,因为''和'decimal'之间没有隐式转换

那么你如何优雅地表达这一点,并且不要像下面那样玩明显的卡片......

if (!sql.Reader.IsDBNull(IDX_SALEAMOUNT))
    record.SaleAmount = sql.Reader.GetDecimal(IDX_SALEAMOUNT);
Run Code Online (Sandbox Code Playgroud)

或者是最佳解决方案?

Jon*_*eet 13

如果您使用的是C#3,我实际上使用扩展方法可以让您更轻松:

public static decimal? GetNullableDecimal(this DbReader reader, 
    int column)
{
    return reader.IsDBNull(column) ? (decimal?) null : 
        reader.GetDecimal(column);
}
Run Code Online (Sandbox Code Playgroud)

然后您的应用程序代码可以使用:

record.SaleAmount = sql.Reader.GetNullableDecimal(IDX_SALEAMOUNT);
Run Code Online (Sandbox Code Playgroud)