2011-07-19 10 views
11

Chciałbym użyć Dappera w sytuacji, gdy wykonanie pojedynczej procedury przechowywanej zwróci 50 wielu oddzielnych wyborów, żaden z indywidualnych zestawów wyników nie będzie być bardzo szerokim, może najwyżej 20 lub 30 kolumn. Poniższy kod pochodzi z Testów Dappera i zastanawiam się, czy ten przykład jest dobrym prototypem do użycia.Jak zmapować wiele rekordów z pojedynczego SP za pomocą Dapper-dot-net

Dziękuję Stephen

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"); 
    } 

EDIT

Oto przykład na podstawie marcs odpowiedź.

 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

Gdzie jest SP? W szczególności czy jest to wynik * szeroki *, czy też wiele oddzielnych wyborów? Oba działają z eleganckim, ale składnia różni się między dwoma układami: –

+0

(Wiem, że był to tylko przykład, ale zmienna tabeli mogła być w tym lepsza, btw) –

+0

Marc, edytowałem wpis, aby odzwierciedlić Twoje pytania . –

Odpowiedz

22

Ten jest na stronie głównej, ale nie powinno być podobne w testach:

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

Argumenty etc pracy jako normalne i powinno map bezpośrednio do określonych nazw parametrów jeśli CommandType jest określona.

Każde połączenie z numerem .Read<T>() dotyczy kolejnej siatki wyników.

+0

Marc, w jaki sposób mogę przekazać parametry? Procedura lub funkcja "__sp_GetMISMOLoanInfo" oczekuje parametru "@loannum", który nie został dostarczony. –

+0

@SPATEN przekazałeś, na przykład, 'nowa {loannum = twoja wartość}? –

+0

Tak, podobnie jak kod wklejony jako EDYCJA. Ustawiłem go nawet na ciąg znaków, ponieważ jest to nasz typ danych "Numer kredytu". UTWÓRZ PROCEDURA [dbo]. [__ sp_GetMISMOLoanInfo] \t @ wanannum varchar (15) –

Powiązane problemy