使用Linq查询查询Datatable DBNull

时间:2016-02-01 07:44:11

标签: c# linq asp.net-mvc-4

我有一个DataSet,其中包含一个名为Vacs的数据表,它有一个名为VacDate的日期列,在某些情况下它保存空值。

现在,当我尝试使用linq查询进行查询时,我得到了以下异常

  

表\'Vacs \'中列''VacDate \'的值是DBNull

我的代码是:

var Vacs = new MyDataSetTableAdapter.MyVacsTableAdapter();
DataTable Vacations = Vacs.GetData()
       .Where(s => s.VacDate == DateTime.Now)
       .ToList()
       .CopyToDataTable();

我确实尝试了以下但仍然遇到同样的错误

DataTable Vacations = Vacs.GetData()
       .Where(s => s.VacDate != null && s.VacDate == DateTime.Now)
       .ToList()
       .CopyToDataTable();

我相信解决方案很简单,但直到现在我仍然没有看到它。

提前谢谢。

最好的问候......

1 个答案:

答案 0 :(得分:1)

很难说出MyVacsTableAdapter课程的实施情况。似乎问题就在于它的实现 - 当你获得VacDate属性值时,你没有处理DbNull情况。无论如何 - 使用LINQ to DataSet进行此类过滤很容易。如果Vacs很简单DataTable,则只创建符合某些条件的行的新DataTable,如下所示:

DataTable allVacations = new DataTable(); // get filled DataTable
DataTable nextVacations = allVacations.AsEnumerable()
                             .Where(r => r.Field<DateTime?>("VacDate") >= DateTime.Today)
                             .CopyToDataTable();

LINQ可以处理DbNull情况并将单元格值转换为适当的数据类型。

注意:您在条件检查中使用DateTime.Now。在比较时,某个时间值不太可能与当前时间的滴答完全匹配。您应该在这里使用>=<=运算符。或比较日期。