You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:41:35