当列具有空值

时间:2018-03-06 14:54:47

标签: c# linq ado.net dataset

我正在尝试将数据集转换为对象列表。

以下是我的尝试:

List<FundPerformanceRecord> FundPerformanceRecordList 
                            = ds.Tables[0].AsEnumerable()
                                .Select(x => new FundPerformanceRecord
                                         {
                                             FundCode = x.Field<string>("FUND_CODE"),
                                             OneMonth = x.Field<decimal>("ROR1MTH"),
                                             ThreeMonth = x.Field<decimal>("ROR3MTH")                                     
                                         })                         
                                .ToList();

FundPerformanceRecord类具有定义为Nullable Decimal的属性。

    [DataMember]
    public string FundCode;

    [DataMember]
    public decimal? OneMonth;

    [DataMember]
    public decimal? ThreeMonth;

如果数据集中的任何Cell值具有空值,则会收到以下错误消息。

System error - Cannot cast DBNull.Value to type 'System.Decimal'. Please use a nullable type.

如何解决此问题?

2 个答案:

答案 0 :(得分:2)

Field方法支持可空类型,您只需使用它们::

....
 .Select(x => new FundPerformanceRecord
 {
     FundCode = x.Field<string>("FUND_CODE"),
     OneMonth = x.Field<decimal?>("ROR1MTH"),
     ThreeMonth = x.Field<decimal?>("ROR3MTH")                                     
 })   
....

答案 1 :(得分:1)

您的模型包含可以为空的decimal?类型的字段,但是当您从DataTable访问和投射时,您使用的是decimal而不是decimal?

尝试使用x.Field<decimal?>,如下所示:

List<FundPerformanceRecord> FundPerformanceRecordList 
                            = ds.Tables[0].AsEnumerable()
                                .Select(x => new FundPerformanceRecord
                                         {
                                             FundCode = x.Field<string>("FUND_CODE"),
                                             OneMonth = x.Field<decimal?>("ROR1MTH"),
                                             ThreeMonth = x.Field<decimal?>("ROR3MTH")                                     
                                         })                         
                                .ToList();