Dapper 传递动态参数

Posted

技术标签:

【中文标题】Dapper 传递动态参数【英文标题】:Dapper passing dynamic param 【发布时间】:2013-01-17 08:21:58 【问题描述】:

我目前正在为 Dapper 编写一个包装器。这个包装器强制每个查询都是一个存储过程。

在我的包装中,我这样称呼 Dapper(有问题):

public IEnumerable<T> Select<T>(string storedProcName, dynamic param) 
    IEnumerable<T> results;

    using(var connection = new SqlConnection(_connectionString) 
        results = connection.Query<T>(storedProcName, param, commandType: CommandType.StoredProcedure);
    

    return results;

当我尝试将“参数”传递给查询时,它告诉我“无法解析符号查询”。当我删除参数传递时,它工作正常。

谁能指出我正确的方向,以便我可以将动态参数(或类似的东西)传递给 Dapper?

【问题讨论】:

【参考方案1】:

您只需将参数更改为类型对象,当您调用它时,您可以使用匿名类型来传递您的参数。

public IEnumerable<T> Select<T>(string storedProcName, object param) 
    IEnumerable<T> results;

    using(var connection = new SqlConnection(_connectionString) 
        results = connection.Query<T>(storedProcName, param, commandType: CommandType.StoredProcedure);
    

    return results;

那么你可以这样称呼它:

var results = query.Select<Entity>("spname", new  Id = 2, Something = "test" );

【讨论】:

【参考方案2】:

你可以把它扔掉:

results = connection.Query<T>(storedProcName,
    (object)param, commandType: CommandType.StoredProcedure);

我再次怀疑dynamic 的智慧;我知道这是有原因的,但我怀疑它弊大于利。坦率地说,dapper 可以很好地处理 object(“原因”是 IDE 问题,而不是语言问题)。

【讨论】:

以上是关于Dapper 传递动态参数的主要内容,如果未能解决你的问题,请参考以下文章

dapper 参数不定时用这种方法动态参数

如何使用字符串作为参数遍历 Dapper 动态查询结果?

dapper利用DynamicParameters构建动态参数查询

使用dapper进行参数化查询

Dapper 示例代码的说明

Dapper.net 十进制输出参数不返回精度值