【问题标题】:Filer DataTable to exclude DBNull.ValueFiler DataTable 排除 DBNull.Value
【发布时间】:2009-04-17 20:06:37
【问题描述】:

我从 excel 文件中收到一个 DataTable,第一列中的数据如下所示:

11129

DBNull.Value

29299

29020

DBNull.Value

29020

我正在使用 LINQ 来选择 distict,如果没有如下 DBNull.Value 值,它就可以工作。

albumIds = dt.AsEnumerable().Select(p => (int)p.Field<double>("F1")).Distinct().ToArray();

但如果 DBNull.Value 代表空的 excel 单元格,我会收到转换错误。

如何从我的结果集中过滤掉那些DBNull.Value

谢谢

【问题讨论】:

  • 如何将数据从 excel 获取到数据表?是否有不止一列?

标签: c# asp.net linq datatable


【解决方案1】:

正如 Jeremy 的回答中所暗示的,如果您引用了 System.Data.DataSetExtensions.dll,您将获得一些方便的扩展方法,用于使用 LINQ 处理数据集和数据表。具体来说,您可以使用 Field&lt;int?&gt;() 方法将可能包含 DBNull 的整数列转换为可为空的整数列...

albumIds = dt.AsEnumerable().Select(row => row.Field<int?>("F1"))
                            .Where(val => val.HasValue)
                            .Select(val => val.Value)
                            .Distinct()
                            .ToArray();

【讨论】:

    【解决方案2】:

    您只需要先过滤掉空值。那么你的 LINQ 表达式应该可以很好地工作。

    【讨论】:

    • 是的,我该如何过滤掉 Null 值?
    【解决方案3】:

    在尝试转换之前,您需要检查 DBNull 的字段,使用 Where 方法可能是最简单的。

    dt.AsEnumerable().Where(p => p.Field("F1") != DBNull.Value).Select(p => (int)p.Field("F1")).Distinct().ToArray();
    

    【讨论】:

    • 这不起作用,因为使用字段扩展您需要指定类型字段
    【解决方案4】:

    你可以试试这个:

    dt.AsEnumerable().Where(p => p.IsNull("F1") == false)
      .Select(p => p.Field<int>("F1")).Distinct().ToArray();
    

    我无法真正检查这个,因为我没有这个数据库设置

    【讨论】:

      【解决方案5】:

      我会回答我自己的问题。

      我不使用 Linq,而是执行 foreach 循环并在值为 null 时删除行。 然后做 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();
      

      【讨论】:

        猜你喜欢
        • 2012-05-29
        • 2016-09-18
        • 1970-01-01
        • 2011-02-27
        • 1970-01-01
        • 2016-04-27
        • 2020-05-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多