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

标签 c# .net dapper

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

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

最佳答案

您只需使用更多参数:

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

关于c# - 如何在SQL参数中添加多个 "WHERE conditionA OR conditionB OR conditionC"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68953910/

相关文章:

c# - Dapper 多映射 API splitOn 参数错误 - 我没有使用 MultiMapping

sql - 使用 Dapper 在 SQL 语句中参数化 LIKE 子句

database - 为什么我可以使用 Dapper 而不是 Entity Framework 来拥有多个数据读取器?

c# - 使用 C# .net 防止 RichTextBox 中的退格键

.net - 如何 XML 序列化 DateTimeOffset 属性?

c# - MemoryMappedFiles 找不到路径的一部分

c# - PowerShell 中内联 C# 中的 ScriptBuilder(2.0 及更高版本)

c# - 没有监听器的事件会对性能产生相当大的影响吗?

C# System.InvalidCastException 异常

c# - 在 C# 中回滚 Entity Framework 迁移