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

Way*_*ina 7 stored-procedures query-by-example dapper

基本上,我想对存储过程使用"漂亮"的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();
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sam*_*ron 9

如果您想指定参数,则需要明确指定:

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();
Run Code Online (Sandbox Code Playgroud)

我们不这样做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();
Run Code Online (Sandbox Code Playgroud)