2011-07-19 29 views
11

Tôi muốn sử dụng Dapper trong trường hợp thực hiện một thủ tục được lưu trữ sẽ trả về 50 lần chọn riêng biệt, không có bộ kết quả riêng lẻ nào rất rộng, có thể là 20 hoặc 30 cột. Mã dưới đây là từ các xét nghiệm Dapper và tôi tự hỏi nếu ví dụ này là một nguyên mẫu tốt để sử dụng.Cách ánh xạ nhiều bản ghi từ một SP duy nhất với Dapper-dot-net

Cảm ơn bạn, 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

Đây là một mẫu dựa trên Marcs câu trả lời.

 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 ở đâu? Đặc biệt, nó có phải là kết quả * rộng * hay nhiều lựa chọn riêng biệt không? Cả hai làm việc với dapper, nhưng cú pháp là khác nhau giữa hai bố trí –

+0

(Tôi biết nó chỉ là một ví dụ, nhưng một biến bảng có thể đã được tốt hơn trong đó, btw) –

+0

Marc, tôi đã chỉnh sửa bài viết để phản ánh câu hỏi của bạn . –

Trả lời

22

Cái này là từ trang chủ, nhưng không nên có tương tự như trong các bài kiểm tra:

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

Arguments vv làm việc như bình thường, và nên bản đồ trực tiếp đến tên tham số được xác định nếu CommandType được chỉ định.

Mỗi cuộc gọi đến .Read<T>() liên quan đến lưới kết quả liên tiếp.

+0

Marc, làm cách nào để vượt qua paramater? Thủ tục hoặc hàm '__sp_GetMISMOLoanInfo' mong đợi tham số '@loannum', không được cung cấp. Ví dụ: –

+0

@SPATEN bạn đã vượt qua, ví dụ: 'new {loannum = yourValue} '? –

+0

Có, giống như mã tôi đã dán làm EDIT. Tôi thậm chí đã đặt nó thành một chuỗi vì đó là kiểu dữ liệu 'Loan số' của chúng tôi. TẠO THỦ TỤC [dbo]. [__ sp_GetMISMOLoanInfo] \t @loannum varchar (15) –

Các vấn đề liên quan