Dapper是否支持使用存储过程的强类型对象?

时间:2012-05-22 15:44:28

标签: stored-procedures dapper query-by-example

基本上,我想对存储过程使用“漂亮”的Dapper语法,而不必手动使用exec MySproc @p1, @p2, @p3, @p4等等,但我需要能够传入具有各种属性的强类型对象设置并将此对象用于映射参数。我知道我可以用一个匿名对象来做这个,但我想到的场景就像一个复杂的搜索表单,可以搜索几个字段,相应的存储过程可以有很多参数(很多都有默认值) )。

理想情况下,我希望能够做到这样的事情:

var cust = new Customer();
cust.FirstName = ...
cust.LastName = ...

// using .NET 3.5 so need to use ugly syntax :(
var result = connection.Query<Customer>("MySproc", cust, null, false, null, CommandType.StoredProcedure).Single();

然而,这不起作用并抛出错误,因为我的Customer对象可能有十几个或更多属性,而我在这种情况下只寻找两个; Dapper似乎只是检查每个属性并分配一个值,假设sproc中有相应的参数可能没有。

我可以使用PetaPoco做类似的事情(传入一个强类型对象一个匿名对象),但我正在寻找比PetaPoco更抽象的东西。

我想在Dapper中做什么(或者其他微型ORM?我不能使用NHibernate或重量级ORM),或者是否有一种方法我可以忽略得到相同的功能而不必写一个exec什么可能是十几个参数?

2 个答案:

答案 0 :(得分:9)

如果您想指定params,您需要明确指出:

var result = connection.Query<Customer>("MySproc", 
     new {cust.Id, cust.Name}, // specify the params you want to give it.  
     null, 
     false, 
     null, 
     CommandType.StoredProcedure).Single();

我们不会对proc进行sp_help params嗅探,尽管您可能会构建一个帮助程序,并允许您运行:cust.ToProcParams('MySproc')

或者,如果要动态构建此参数,则可以使用。

var dp = new DynamicParameters(); 
dp.Add("Id", cust.Id);
dp.Add("Name", cust.Name);
var result = connection.Query<Customer>("MySproc", 
         dp,
         null, 
         false, 
         null, 
         CommandType.StoredProcedure).Single();

答案 1 :(得分:2)

如果您使用的是SQL Server,请查看Insight.Database。 https://github.com/jonwagner/Insight.Database/wiki它更倾向于存储过程,并使用SqlDeriveParameters来确定对象和存储过程之间的映射。

注意:它目前需要.NET 4.0,但如果你真的对.NET 3.5版本感兴趣,我可以看到它会有多难。