我正在做分页。我现在拥有的是:
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/