DataTable 数据过滤与查询之踩坑记录

当数据格式是DataTable时 我们可以利用 DataColumn.Expression 进行数据过滤与查询

对应语法:https://learn.microsoft.com/zh-cn/dotnet/api/system.data.datacolumn.expression?view=net-6.0#System_Data_DataColumn_Expression

  • 时间过滤 =
DataTable dt = new DataTable();
// 添加日期列
dt.Columns.Add("Date", typeof(DateTime));

// 添加数据行(包括一些日期为空的行)
dt.Rows.Add(new object[] { new DateTime(2022, 1, 1) });
dt.Rows.Add(new object[] { DBNull.Value });
dt.Rows.Add(new object[] { new DateTime(2022, 2, 1) });
dt.Rows.Add(new object[] { new DateTime(2022, 3, 1) });
dt.Rows.Add(new object[] { DBNull.Value });
dt.Rows.Add(new object[] { new DateTime(2021, 12, 31) });

// 使用DataColumn.Expression筛选日期
DataRow[] result = dt.Select("Date = #2022-01-01#"); or  DataRow[] result = dt.Select("Date = '2022-01-01'");

// 输出结果
foreach (DataRow row in result)
{
    Console.WriteLine(row["Date"]);
}
输出结果为:

2/1/2022 12:00:00 AM
3/1/2022 12:00:00 AM

当字段类型为时间 且值为DBNull.Value时

DataRow[] result = dt.Select("Date = ##"); or  DataRow[] result = dt.Select("Date = ''");

便会报错Cannot perform '=' operation on System.DateTime and System.String. 此时'' 标识的是字符串空 而不是时间空
解决:DataRow[] result = dt.Select("Date is null");

其他类型语法注意

字符串值应括在单引号中 (,字符串值中的每个单引号字符都必须通过附加另一个单引号字符) 来转义。 日期值应括在磅号 (#) 或单引号内, (') 基于数据提供程序。 数值允许使用十进制数和科学表示法

“FirstName = 'John'”

“Price <= 50.00”

“Birthdate < #1/31/82#”

对于包含枚举值的列,请将该值强制转换为整数数据类型。 例如:

“EnumColumn = 5”
posted @ 2023-03-13 17:30  C余L小R鱼  阅读(121)  评论(0编辑  收藏  举报