【问题标题】:Does Dapper support strongly typed objects with a stored procedure?Dapper 是否支持带有存储过程的强类型对象?
【发布时间】:2012-05-29 03:29:07
【问题描述】:

基本上,我想对存储过程使用“漂亮”的 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有十几个参数的语句?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      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 参数嗅探,尽管您可能会构建一个助手来执行此操作并允许您运行: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();
      

      【讨论】:

      • 这就是我所害怕的,因为使用匿名对象使我无法根据输入动态构建对象。不过,辅助方法的想法很有趣。
      • 现在看起来很有趣。我将不得不玩弄它,看看它是如何工作的。非常感谢,山姆!
      猜你喜欢
      • 2017-07-05
      • 2018-01-30
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 2017-08-15
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多