Filer DataTable排除DBNull.Value

时间:2009-04-17 20:06:37

标签: c# asp.net linq datatable

我从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?

谢谢

5 个答案:

答案 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();