【问题标题】:How do I add multiple "WHERE conditionA OR conditionB OR conditionC" in SQL parameter?如何在 SQL 参数中添加多个“WHERE 条件或条件或条件”?
【发布时间】:2021-08-29 09:41:07
【问题描述】:

我正在做分页。我现在拥有的是:

public void GetAllDevices(int siteId, List<int> deviceTypes, int rowsOffset, int pageSize)
{
    var param = new
    {
        SiteId = siteId,
        RowsOffset = rowsOffset,
        PageSize = pageSize
    };

    string sqlQuery = @"SELECT * FROM device WHERE site_id = @SiteId
                        ORDER BY site_id
                        OFFSET @RowsOffset ROWS
                        FETCH NEXT @PageSize ROWS ONLY";

    var response = await conn.QueryAsync<Model.Device>(sqlQuery, param);
}

所有非常标准的东西。现在,用户还可以对设备类型进行多次过滤,所以如果我要编写原始 SQL,它将如下所示:

SELECT * FROM device WHERE site_id = @SiteId
WHERE device_type_id = 1 OR device_type_id = 2 OR device_type_id = 3
ORDER BY site_id
OFFSET @RowsOffset ROWS
FETCH NEXT @PageSize ROWS ONLY

我的问题是如何编写 WHERE 子句的参数?我在这里添加什么:

var param = new
{
    SiteId = siteId,
    RowsOffset = rowsOffset,
    PageSize = pageSize
};

我正在使用 Dapper 和 PostgreSQL 13,在 .NET5 上运行。

附加信息: 请参阅已接受的答案以了解如何执行此操作。请注意,它适用于 SQL Server,但不适用于 PostgreSQL。 PostgreSQL 不支持“IN”,所以你必须改为“ANY”。参考:Dapper.net "where ... in" query doesn't work with PostgreSQL

【问题讨论】:

    标签: c# .net dapper


    【解决方案1】:

    你只是使用更多的参数:

    SELECT *
    FROM device WHERE site_id = @SiteId
    AND (device_type_id = @DeviceTypeID1
        OR device_type_id = @DeviceTypeID2
        OR device_type_id = @DeviceTypeID3)
    ORDER BY site_id
    OFFSET @RowsOffset ROWS
    FETCH NEXT @PageSize ROWS ONLY
    
    var param = new
    {
        SiteId = siteId,
        RowsOffset = rowsOffset,
        PageSize = pageSize,
        DeviceTypeID1 = deviceTypeID1,
        DeviceTypeID2 = deviceTypeID2,
        DeviceTypeID3 = deviceTypeID3
    };
    

    这是假设您用于设备类型的用户输入的变量的名称。许多人需要根据如何从用户那里收集输入来以不同的方式解构它。您可能需要根据您的数据结构动态构造 SQL 字符串。

    (旁注:you should avoid using SELECT * 并具体说明您在结果中需要的列)

    由于您正在为设备类型传递List&lt;int&gt;,因此您可以使用IN 重写您的查询,并只需在单个参数中传递列表。 Dapper 允许您传递 IEnumerable 并为您完成构建变量列表的工作:

    SELECT *
    FROM device WHERE site_id = @SiteId
    AND device_type_id IN @DeviceTypeIDs
    ORDER BY site_id
    OFFSET @RowsOffset ROWS
    FETCH NEXT @PageSize ROWS ONLY
    
    var param = new
    {
        SiteId = siteId,
        RowsOffset = rowsOffset,
        PageSize = pageSize,
        DeviceTypeIDs = deviceTypes
    };
    

    【讨论】:

    • 我已经在我的问题中编辑了函数,我的函数接受了一个 List deviceTypes。我构建 SQL 查询没有问题,我可以遍历变量并相应地添加。但是如何动态地将名为 "DeviceTypeID1", "...2", "...3" , ... 的参数添加到匿名对象?
    • @Farid 我已经更新了我的答案,看看新的位
    • 我知道必须有一个简单的解决方案,但从来不知道 Dapper 可以做到这一点。谢谢! :)
    • 你打赌!以下是有关它的更多信息:github.com/DapperLib/Dapper#list-support
    • 两个WHERE 子句?
    猜你喜欢
    • 1970-01-01
    • 2021-04-09
    • 2022-01-19
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    相关资源
    最近更新 更多