如何在 SQL 参数中添加多个 "WHERE conditionA OR conditionB OR conditionC"?

How do I add multiple "WHERE conditionA OR conditionB OR conditionC" in SQL parameter?

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

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
};

我在 .NET5 上使用 Dapper 和 PostgreSQL13,运行。

附加信息: 请参阅已接受的答案以了解如何执行此操作。请注意,它适用于 SQL 服务器,但不适用于 PostgreSQL。 PostgreSQL 不支持“IN”,因此您必须改为执行“ANY”。参考:

你只是使用了更多的参数:

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<int>,因此您可以使用 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
};