2011-07-19 15 views
11

ile nasıl birden çok kayıt eşleştirilir Tek bir saklı yordamın yürütülmesinin 50 çoklu seçim yapacağı bir durumda Dapper kullanmak istiyorum, tek tek sonuç kümelerinin hiçbiri çok geniş olabilir, belki en fazla 20 veya 30 sütun. Aşağıdaki kod, Dapper Testlerinden alınmıştır ve bu örneğin kullanmanın iyi bir prototip olup olmadığını merak ediyorum. Tek bir SP'den Dapper-dot-net

, teşekkür ederiz 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"); 
    } 

DÜZENLEME İşte

Marcs Yanıta göre bir örnektir.

 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 nerede? Özellikle, bir * geniş * sonuç mu, yoksa birden fazla ayrı seçim mi? Her ikisi de dapper ile çalışır, ancak sözdizimi iki düzen arasında farklıdır –

+0

(Ben sadece bir örnek olduğunu biliyorum, ama bir tablo değişkeni daha iyi olabilirdi, btw) –

+0

Marc, Ben senin soruları yansıtmak için yazıyı düzenledim . –

cevap

22

Bu seferki ana sayfasından olmakla testlerde benzer olmalıdır: Normal olarak

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

Argümanlar vb çalışmaları ve CommandType belirtilmişse tanımlanan parametre adlarına doğrudan uygulanmalı.

.Read<T>() numaralı her arama, bir ardışık sonuç tablosuyla ilgilidir.

+0

Marc, paramater'i nasıl geçebilirim? Prosedür veya işlev '__sp_GetMISMOLoanInfo', sağlanan '@loannum' parametresini bekliyor. –

+0

@SPATEN, örneğin bir "yeni {loannum = yourValue}" yöntemini mi geçtiniz? –

+0

Evet, tıpkı EDIT olarak yapıştırdığım kod gibi. Hatta bir dize olarak ayarladım çünkü bu bizim 'Kredi Numarası' veri tipimiz. CREATE PROCEDURE [dbo]. [__ sp_GetMISMOLoanInfo] \t @loannum varchar (15) –