2011-07-19 68 views
11

我想在單個存儲過程的執行將返回50多個單獨的選擇的情況下使用Dapper,但沒有一個單獨的結果集將會非常寬,最多20或30列。下面的代碼來自Dapper測試,我想知道這個例子是否是一個很好的原型。如何使用Dapper-dot-net映射單個SP中的多條記錄

謝謝 斯蒂芬

public void TestMultiMap() 
     { 
      var createSql = @" 
       create table #Users (Id int, Name varchar(20)) 
       create table #Posts (Id int, OwnerId int, Content varchar(20)) 

       insert #Users values(99, 'Sam') 
       insert #Users values(2, 'I am') 

       insert #Posts values(1, 99, 'Sams Post1') 
       insert #Posts values(2, 99, 'Sams Post2') 
       insert #Posts values(3, null, 'no ones post')"; 

       connection.Execute(createSql); 

      var sql = @"select * from #Posts p 
         left join #Users u on u.Id = p.OwnerId 
         Order by p.Id"; 

      var data = connection.Query<Post, User, Post>(sql, (post, user) => { post.Owner = user; return post; }).ToList(); 
      var p = data.First(); 

      p.Content.IsEqualTo("Sams Post1"); 
      p.Id.IsEqualTo(1); 
      p.Owner.Name.IsEqualTo("Sam"); 
      p.Owner.Id.IsEqualTo(99); 

      data[2].Owner.IsNull(); 

      connection.Execute("drop table #Users drop table #Posts"); 
    } 

編輯

這是基於榨渣回答樣本。

 const string sql = @"__sp_GetMISMOLoanInfo"; 
     using (var multi = _connection.QueryMultiple(sql, new { loannum = "3192381" }, commandType: CommandType.StoredProcedure)) 
     { 
      var address = multi.Read<ADDRESS>().Single(); 
      var amortizationRule = multi.Read<AMORTIZATION_RULE>().Single(); 
      var appraiserLicense = multi.Read<APPRAISER_LICENSE>().Single(); 
      var automatedUnderwriting = multi.Read<AUTOMATED_UNDERWRITING>().Single(); 
      var avm = multi.Read<AVM>().Single(); 
      var borrowerDetail = multi.Read<BORROWER_DETAIL>().Single(); 
     } 
+0

SP在哪裏?特別是它是一個*寬*的結果,還是多個單獨的選擇?兩者都適用於Dapper,但兩種佈局的語法不同 –

+0

(我知道這僅僅是一個例子,但是表格變量可能會更好,btw) –

+0

Marc,我編輯了帖子以反映您的問題。 –

回答

22

這一個是從主頁,但應在測試中是類似的:

var sql = @"..."; 
using (var multi = connection.QueryMultiple(sql, new {id=selectedId})) 
{ 
   var customer = multi.Read<Customer>().Single(); 
   var orders = multi.Read<Order>().ToList(); 
   var returns = multi.Read<Return>().ToList(); 
   ... 
} 

參數等工作正常,如果指定的CommandType應直接映射到所定義的參數名稱。

.Read<T>()的每個調用都與連續的結果網格有關。

+0

Marc,我如何通過參數?過程或函數'__sp_GetMISMOLoanInfo'需要參數'@loannum',它沒有提供。 –

+0

@SPATEN你是否通過了一個'new {loannum = yourValue}'? –

+0

是的,就像我作爲編輯粘貼的代碼一樣。我甚至將它設置爲一個字符串,因爲這是我們的'貸款編號'數據類型。 CREATE PROCEDURE [dbo]。[__ sp_GetMISMOLoanInfo] \t @loannum varchar(15) –

相關問題