ASP.NET Core Web API:如何使用Dapper实现日期区间筛选
解决方案
你的现有代码存在SQL语句不完整、查询方法使用错误、参数传递不符合需求等问题,以下是修改后的完整实现:
public async Task<List<Product>> GetByDateBetweenAsync(string fromDate, string toDate) { // 构造SQL:将yyyymmdd格式字符串转为datetime,确保覆盖toDate当天所有时间点的数据 var sql = @"SELECT ProductName, Unit, CostPrice, SellingPrice, CreatedDate FROM Products WHERE CreatedDate >= CONVERT(datetime, @fromDate, 112) AND CreatedDate < DATEADD(day, 1, CONVERT(datetime, @toDate, 112))"; using (var connection = new SqlConnection(configuration.GetConnectionString("DefaultConnection"))) { // 使用QueryAsync获取结果集,而非单个实体 var products = await connection.QueryAsync<Product>(sql, new { fromDate, toDate }); return products.ToList(); } }
关键修改说明:
- SQL逻辑修正:
- 用
CONVERT(datetime, @fromDate, 112)把yyyymmdd格式的字符串参数转为SQL Server支持的datetime类型(112是对应该格式的系统代码)。 - 采用
CreatedDate < DATEADD(day, 1, ...)替代<=,避免因时间精度问题遗漏当天23:59:59这类晚时段的记录。
- 用
- 查询方法替换:将
QuerySingleOrDefaultAsync改为QueryAsync<Product>,因为需要返回多个产品的列表,QueryAsync返回IEnumerable<Product>,最后转成List<Product>即可。 - 参数传递:传入
fromDate和toDate两个参数,与SQL中的变量一一对应。
额外提示:
- 确保
Product类的属性名称与数据库表字段完全匹配(大小写不敏感),Dapper会自动完成属性与字段的映射。 - Dapper会自动处理连接的打开与关闭,手动调用
connection.Open()也不会产生问题。
内容的提问来源于stack exchange,提问作者Ayobamilaye
相关产品推荐
相关产品推荐

