获取错误无法将DBNull.Value强制转换为' System.Int32

时间:2017-02-14 12:00:37

标签: asp.net vb.net linq

我正在使用linq对数据进行分组并使用linq对一列进行汇总但是在运行时我得到错误说明

  

无法将DBNull.Value强制转换为' System.Int32。请使用可空类型"以下是我的代码

Dim resultStyle = invData.Tables(0).AsEnumerable() _
      .GroupBy(Function(v) New With {Key .InvestorStyleID = v.Field(Of Integer)("InstitutionalInvestorStyleID"), Key .StyleName = Not IsNothing(v.Field(Of String)("InstitutionalInvestorStyleName"))}) _
      .Select(Function(v) New With {Key .InvestorStyleID = v.Key.InvestorStyleID, Key .StyleName = v.Key.StyleName, Key .Sum = v.Sum(Function(r) Double.Parse(r.Item("k001ICGeo").ToString()))})

请建议我如何避免取值。我在第二行得到错误

.GroupBy(Function(v) New With {Key .InvestorStyleID = v.Field(Of Integer)("InstitutionalInvestorStyleID"), Key .StyleName = Not IsNothing(v.Field(Of String)("InstitutionalInvestorStyleName"))}).

我不想取空值。

3 个答案:

答案 0 :(得分:0)

DataTables不存储空值,而是存储DBNull

因此,IsNothing无效。

因此,您需要与DBNull.Value(DBNull的单例)进行比较。

答案 1 :(得分:0)

尝试这样的事情:

Dim resultStyle = invData.Tables(0).AsEnumerable() _
                        .GroupBy(Function(v) New With {Key .InvestorStyleID = v.Field(Of Integer?)("InstitutionalInvestorStyleID").GetValueOrDefault, 
                                                        Key .StyleName = If( String.IsNullOrEmpty(v.Field(Of String)("InstitutionalInvestorStyleName")),"", v.Field(Of String)("InstitutionalInvestorStyleName"))}) _
                        .Select(Function(v) New With {Key .InvestorStyleID = v.Key.InvestorStyleID, Key .StyleName = v.Key.StyleName, Key .Sum = v.Sum(Function(r) Convert.ToDouble(r.Item("k001ICGeo"))))})

答案 2 :(得分:0)

错误消息是因为您在分组时尝试投射的列中包含空值,因此只需将其更改为Nullable类型即可。另外,要仅获取不具有空值的记录,请使用Where子句应用过滤器,如下所示: -

Dim resultStyle = invData.Tables(0).AsEnumerable() _
    .GroupBy(Function(v) New With {Key .InvestorStyleID = v.Field(Of Integer?)("InstitutionalInvestorStyleID"), Key .StyleName = Not IsNothing(v.Field(Of String)("InstitutionalInvestorStyleName"))}) _
    .Where(Function(x) x.Key.InvestorStyleID  IsNot Nothing) _
    .Select(Function(v) New With {Key .InvestorStyleID = v.Key.InvestorStyleID, Key .StyleName = v.Key.StyleName, Key .Sum = v.Sum(Function(r) Double.Parse(r.Item("k001ICGeo").ToString()))})

我还添加了一个示例小提示,以显示它如何与一些示例数据一起使用。

Fiddle.