2011-07-19 7 views
11

Me gustaría utilizar Dapper en una situación en la que la ejecución de un solo procedimiento almacenado devolverá 50 selecciones múltiples por separado, ninguno de los conjuntos de resultados individuales ser muy amplio, tal vez 20 o 30 columnas como máximo. El siguiente código es de Dapper Tests y me pregunto si este ejemplo es un buen prototipo para usar.Cómo mapear múltiples registros desde un único SP con Dapper-dot-net

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

EDITAR

Este es un ejemplo basado en la respuesta de los orujos.

 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

¿Dónde está el SP? En particular, ¿es un resultado * ancho * o múltiples selecciones por separado? Ambos funcionan con dapper, pero la sintaxis es diferente entre los dos diseños –

+0

(sé que era solo un ejemplo, pero una variable de tabla podría haber sido mejor en eso, por cierto) –

+0

Marc, he editado la publicación para reflejar tus preguntas . –

Respuesta

22

Éste es de la página de inicio, pero no debe ser similar en las pruebas:

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

Argumentos etc trabajo como normal, y debe asignar directamente a los nombres de parámetros definidos si se especifica CommandType.

Cada llamada al .Read<T>() se relaciona con una grilla de resultados sucesivos.

+0

Marc, ¿cómo paso el parámetro? El procedimiento o la función '__sp_GetMISMOLoanInfo' espera el parámetro '@loannum', que no se suministró. –

+0

@SPATEN ¿pasaste, por ejemplo, un 'nuevo {loannum = yourValue}'? –

+0

Sí, al igual que el código que pegué como EDIT. Incluso lo configuré como una cadena porque ese es nuestro tipo de datos 'Número de préstamo'. CREAR PROCEDIMIENTO [dbo]. [__ sp_GetMISMOLoanInfo] \t @loannum varchar (15) –

Cuestiones relacionadas