如何将Dapper的QueryMultiple与存储过程一起使用,但每次使用不同的参数值?

时间:2016-06-06 02:59:47

标签: c# sql-server dapper

我想用Dapper批量调用存储过程。每次调用都会返回一组不同的结果,因此我使用的是QueryMultiple。如果我创建这样的参数:

    var parameters = new DynamicParameters();
    // The stored proc accepts a single integer, but I want to pass multiple so each call had a new value.
    parameters.Add("LookupID", lookupIds); 

    var resultSet = connection.QueryMultiple("SPName", parameters, commandType: System.Data.CommandType.StoredProcedure);

我收到一条错误,指出存储过程指定了太多参数。那么我怎么能做到这一点呢?

1 个答案:

答案 0 :(得分:1)

QueryMultiple是关于结果,而不是输入。要做你想做的事,你需要多次调用SP。你可以通过一个简单的foreach循环自己做,或者很多(不是全部)dapper方法可以通过传入IEnumerable<T>作为最外面的对象来实现方便,例如:

int[] ids = ...
var args = ids.Select(id => new { id, val = "ABC" });
db.Execute("whatever", args);

对于每个项目传入@id@val的每个项目将执行一次SQL。对于async API,这也可以与MARS结合使用以消除调用之间的延迟成本,但这是选择加入,因为MARS不是默认选项。

或者,您可以编写一个新的包装器SP,它接受一个参数并将其拆分(新的string_split将是理想的),并在服务器上执行循环。