我正在使用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"))}).
我不想取空值。
答案 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()))})
我还添加了一个示例小提示,以显示它如何与一些示例数据一起使用。