基本上,我想对存储过程使用“漂亮”的 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 语句可能是十几个参数?
最佳答案
如果你想指定参数,你需要明确地这样做:
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();
我们不会对 procs 进行
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();