不能在 linq 表达式中将对象从 DBNull 强制转换为其他类型的对象

本文关键字:对象 转换 其他 类型 linq 表达式 不能 DBNull | 更新日期: 2023-09-27 18:36:33

var gFieldList = new List<string>() { "Supplier", "Country" };
    var sFieldList = new List<string>() { "Sales"};
     var gField = string.Join(", ", gFieldList.Select(x => "it['"" + x + "'"] as " + x));
     var sField = string.Join(", ", sFieldList.Select(y => "Sum(Convert.ToDouble(it['""+y+"'"])) as "+y));

         var newSort = dataTable
                        .AsEnumerable()
                        .AsQueryable()
                        .GroupBy("new("+gField+")", "it")
                        .Select("new("+sField+",it.Key as Key, it as Data)");
var groupedData = (from dynamic dat in newSort select dat).ToList();

抛出异常

对象不能从 DBNull 强制转换为其他类型。

在最后一行,

var groupedData = (from dynamic dat in newSort select dat).ToList();

如何解决这个问题?

不能在 linq 表达式中将对象从 DBNull 强制转换为其他类型的对象

编辑2:尝试像这样更改转换

sFieldList.Select(y => "Sum(Convert.ToDouble(iif(it['""+y+"'"] == @0,0,it['""+y+"'"]))) as "+y)

然后

var newSort = dataTable
                .AsEnumerable()
                .AsQueryable()
                .GroupBy("new("+gField+")", "it")
                .Select("new("+sField+",it.Key as Key, it as Data)",DBNull.Value);

UPDATE2:对于四舍五入的结果,请尝试以下操作:

sFieldList.Select(y => "Sum(Math.Round(Convert.ToDouble(iif(it['""+y+"'"] == @0,0,it['""+y+"'"])),2)) as "+y)

试试这个:

var gFieldList = new List<string ?>() { "Supplier", "Country" };
var sFieldList = new List<string ?>() { "Sales"};