dataGrid.DataSource = customDS.customDT.AsEnumerable()
.GroupBy(r => r.Field("someID"))
.Select(g => {
CustomDS.customRow row = customDS.customDT.NewcustomRow();
row["someID"] = g.Key;
row["Tradingdate"] = g.First().Tradingdate;
row["MemberNo"] = ((object)g.First().MemberNo == DBNull.Value) ? "a" : "b";
row["Amt"] = (decimal?)g.Sum(r => r.Field("Amt"));
return row;
}).CopyToDataTable();
我有以上代码抛出异常,因为MemberNo
DBNull
customDT
a
。在上面的例子中,我不明白已经通过转换为对象并与DBNull进行比较来明确应用检查,并硬编码为字符串b
或{{1}}
答案 0 :(得分:0)
您可以处理DBNull值,如下所示:
row["CancelledDate"] == DBNull.Value ? (DateTime?)null :
Convert.ToDateTime(row["CancelledDate"]);
答案 1 :(得分:0)
我创建了通用方法来获取值并处理DBNull
场景
public static T GetColumnValue<T>(string columnName, DataRow dr)
{
Type typeParameterType = typeof(T);
//dr.Table.Columns.Contains(columnName)
//this line can be removed if you are sure you are going to get columns
//it all depends on requirement and preference
return dr.Table.Columns.Contains(columnName) && dr[columnName] != DBNull.Value
? (T) Convert.ChangeType(dr[columnName] , typeParameterType)
: default(T);
}
你只是尝试这样
row["MemberNo"] = string.IsNullOrEmpty(GetColumnValue("MemberNo", g.First()))
? "a" : "b";
答案 2 :(得分:0)
问题是MemberNo可以为null。
那么你不能使用First()的结果,没有null检查。
相反,请使用g.FirstOrDefault()
。
var m = g.FirstOrDefault();
row["MemberNo"] = m != null ? "a" : "b";
答案 3 :(得分:0)
row["MemberNo"] = g.First().IsMemberNoNull() ? "a" : "b";
显然可以调用IscolumnnameNull()
方法来处理DBNull
值吗?