使用Dapper+PostgreSQL13时如何为SQL添加多个OR的WHERE条件参数
适配Dapper + PostgreSQL 13的设备类型筛选实现方案
1. 修改param参数对象
直接在匿名参数中新增DeviceTypes字段,传入接收到的设备类型列表即可:
var param = new { SiteId = siteId, RowsOffset = rowsOffset, PageSize = pageSize, DeviceTypes = deviceTypes };
2. 调整SQL查询语句
使用PostgreSQL原生支持的ANY语法实现数组匹配,效果等价于多个OR拼接的筛选逻辑:
SELECT * FROM device WHERE site_id = @SiteId AND device_type_id = ANY(@DeviceTypes) ORDER BY site_id OFFSET @RowsOffset ROWS FETCH NEXT @PageSize ROWS ONLY
可选:兼容无筛选的场景
如果需要支持用户未选择任何设备类型时返回所有类型设备,可以动态拼接WHERE条件:
var whereConditions = new List<string> { "site_id = @SiteId" }; // 仅当设备类型列表不为空时追加筛选条件 if (deviceTypes != null && deviceTypes.Any()) { whereConditions.Add("device_type_id = ANY(@DeviceTypes)"); } string sqlQuery = $@"SELECT * FROM device WHERE {string.Join(" AND ", whereConditions)} ORDER BY site_id OFFSET @RowsOffset ROWS FETCH NEXT @PageSize ROWS ONLY";
实现说明
Dapper会自动将.NET的List<int>类型参数转换为PostgreSQL可识别的int数组类型,ANY运算符可以直接判断字段值是否存在于数组中,既避免了手动拼接OR的繁琐,也不存在SQL注入风险,执行效率和原生编写的多OR语句一致。
内容的提问来源于stack exchange,提问作者Farid
相关产品推荐
相关产品推荐

