我从excel文件收到一个DataTable,第一列中的数据如下所示:
11129
DBNull.Value
29299
29020
DBNull.Value
29020
我正在使用LINQ来选择distict,如果没有DBNull.Value值,它会起作用。 albumIds = dt.AsEnumerable()。选择(p =>(int)p.Field(“F1”))。Distinct()。ToArray();
但如果出现DBNull.Value表示空的excel单元格,则会出现转换错误。
如何从结果集中过滤掉那些DBNull.Value?
谢谢
答案 0 :(得分:3)
正如Jeremy的回答中暗示的那样,如果你引用System.Data.DataSetExtensions.dll,你将获得一些方便的扩展方法,用于使用LINQ处理DataSet和DataTables。具体来说,您可以使用Field <int?>
()方法将可能包含DBNull的整数列转换为可为空的整数列...
albumIds = dt.AsEnumerable().Select(row => row.Field<int?>("F1"))
.Where(val => val.HasValue)
.Select(val => val.Value)
.Distinct()
.ToArray();
答案 1 :(得分:0)
您只需首先过滤掉空值。然后你的LINQ表达式应该运行得很好。
答案 2 :(得分:0)
在尝试使用Where方法最简单的转换之前,您需要检查DBNull的字段。
dt.AsEnumerable().Where(p => p.Field("F1") != DBNull.Value).Select(p => (int)p.Field("F1")).Distinct().ToArray();
答案 3 :(得分:0)
你可以试试这个:
dt.AsEnumerable().Where(p => p.IsNull("F1") == false)
.Select(p => p.Field<int>("F1")).Distinct().ToArray();
我无法检查这个,因为我没有这个数据库设置
答案 4 :(得分:-1)
我会回答我自己的问题。
如果value为null,则不使用Linq而是执行foreach循环并删除行。 然后做Linq distinct
foreach(DataRow row in dt.Rows)
{
if (String.IsNullOrEmpty(row["F1"].ToString()))
row.Delete();
}
dt.AcceptChanges();
albumIds = dt.AsEnumerable().Select(p => (int)p.Field<double>("F1")).Distinct().ToArray();