动态参数化查询与dapper

本文关键字:dapper 查询 参数 动态 | 更新日期: 2023-09-27 18:02:58

我想写一个查询与参数的动态列表(取决于参数是否设置)。我想使用dapper在oracle数据库上执行查询。

示例代码:

        var sqlParams = new List<object>();
        var sqlBuilder = new StringBuilder();
        sqlBuilder.Append("SELECT * FROM EXAMPLE WHERE 1 = 1 ");
        if (!string.IsNullOrEmpty(aParam))
        {
            sqlBuilder.Append(" AND A LIKE ?");
        }
        if (!string.IsNullOrEmpty(bParam))
        {
            sqlBuilder.Append(" AND B LIKE ? ");
        }
        var sql = sqlBuilder.ToString();
        return this.Connection.Query<Equipment>(
            sql,
            new { aParam, bParam }   // ??
            ).ToList();

动态参数化查询与dapper

Dapper实际上只适用于命名参数。我记得在oracle中它们是冒号前缀的,所以:

if (!string.IsNullOrEmpty(aParam))
{
    sqlBuilder.Append(" AND A LIKE :aParam");
}
if (!string.IsNullOrEmpty(bParam))
{
    sqlBuilder.Append(" AND B LIKE :bParam");
}

现在你的现有代码在这里:

return this.Connection.Query<Equipment>(
    sql,
    new { aParam, bParam }
    ).ToList();

应该工作。Dapper使用匿名类型的成员名作为参数名。它还包括一些非常基本的代码来检查sql中是否存在任何给定的成员,因此,如果sql 提到:bParam,它实际上不会添加aParam值作为参数。

在更复杂的场景中,您还可以使用DynamicParameters对象,它的功能更像字典-但这里不需要