使用dapper进行动态参数化查询

时间:2014-05-13 10:03:09

标签: c# sql oracle dapper

我想用动态参数列表编写一个查询(取决于是否设置参数)。 我想使用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();

1 个答案:

答案 0 :(得分:2)

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,则它实际上不会添加{{ 1}}值作为参数。

在更复杂的场景中,您还可以使用aParam对象,其功能更像是字典 - 但您不需要这样做。