使用 Linq Query 查询数据表 DBNull

本文关键字:数据表 DBNull 查询 Query Linq 使用 | 更新日期: 2023-09-27 18:32:39

我有一个数据集,其中包含一个名为 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();

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

提前谢谢你。

此致敬意。。。

使用 Linq Query 查询数据表 DBNull

很难说你的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。在比较时,某些时间值不太可能与当前时间的即时报价完全匹配。您可能应该在此处使用>=<=运算符。或者只比较日期。