【问题标题】:Dynamic Parameterized query with dapper使用 dapper 的动态参数化查询
【发布时间】:2014-06-30 22:48:18
【问题描述】:

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

【问题讨论】:

    标签: c# sql oracle dapper


    【解决方案1】:

    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 only 提到 :bParam,它实际上不会添加 aParam 值作为参数。

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

    【讨论】:

    • 如何在第二个 sn-p 中动态添加aParam, bParam?是否可以用ExpandoObject 替换new { aParam, bParam }?我不想硬编码aParam, bParam。我想通过循环添加它们。不过,Query&lt;Equipment&gt;() 似乎不支持将 ExpandoObject 作为其第二个参数。
    • @kkuilla 你可以使用DynamicParameters,或者坦率地说你可以同时传入(dapper 将忽略任何明显未使用的内容)
    猜你喜欢
    • 2017-09-10
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多