7

基本上,我想为存储过程使用“漂亮”的 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 似乎只是检查每个属性并分配一个值,假设存储过程中可能没有相应的参数。

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

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

4

2 回答 2

10

如果你想指定参数,你需要明确地这样做:

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();

我们不会sp_help对 procs 进行 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();
于 2012-05-23T06:08:30.063 回答
2

如果您使用的是 SQL Server,请查看 Insight.Database。https://github.com/jonwagner/Insight.Database/wiki更面向存储过程,使用SqlDeriveParameters来确定对象与存储过程的映射关系。

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

于 2012-05-29T21:00:52.987 回答