使用Dapper通过两个DateTime过滤SQL日期的参数冲突问题
正确的Dapper参数配置方案
你的问题核心是匿名对象参数名与SQL中的参数名不匹配,且错误重复声明了同一个键,同时DateTime范围过滤不需要使用模糊匹配的%符号。以下是修正后的代码:
修正后的完整代码
public List<Deliveries> GetDeliveriesFilter(DateTime date1, DateTime date2, string text) { string q = @"SELECT ..., d.DesiredDate AS DateOfDelivery, .... WHERE d.DesiredDate >= @date1 AND d.DesiredDate <= @date2 AND p.Name COLLATE latin1_german1_ci LIKE @text ..."; var result = db.Query<Deliveries>(q, new { date1 = date1, // 对应SQL中的@date1参数 date2 = date2, // 对应SQL中的@date2参数 text = "%" + text + "%" // 对应SQL中的@text参数,模糊匹配才需要加% }); return result.ToList(); }
关键修正点说明
- 参数名严格匹配:SQL中定义的参数是
@date1、@date2、@text,匿名对象的键名必须和这些参数名完全一致,不能随意改成DateOfDelivery或Name。 - DateTime无需模糊处理:你是做时间段范围过滤(
>=和<=),直接传入原始DateTime值即可,%仅用于字符串的模糊查询(比如LIKE语句)。 - 禁止重复键名:C#匿名类型不允许重复属性名,两次声明
DateOfDelivery是编译错误的直接原因。
额外优化建议
如果需要确保date2包含当天所有数据(比如用户传入2024-05-20,希望覆盖到当天23:59:59的记录),可以对date2做如下处理:
date2 = date2.Date.AddDays(1).AddTicks(-1); // 转为当天的23:59:59.9999999
内容的提问来源于stack exchange,提问作者Jocelyn
相关产品推荐
相关产品推荐

