Devolver un único parámetro como parte de una consulta de asignación múltiple

c# dapper

Pregunta

Tengo un escenario en el que necesito devolver una sola columna como parte de una consulta de múltiples mapas en Dapper .

He simplificado el ejemplo a continuación pero, en esencia, el valor de una sola columna (el int) que deseo recuperar no es una propiedad de la clase Post (pero está en la tabla de la base de datos).

Deseo obtener este valor por sí mismo, utilizándolo de manera similar a la siguiente línea del ejemplo, donde el estado es el valor int en cuestión:

post.SetSomeStatus(status);

Aquí está el ejemplo del código:

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

    var data = connection.Query<Post, User, int, Post>(sql, (post, user, status) => { 
        post.Owner = user;
        post.SetSomeStatus(status);
        return post;
    });

    var post = data.First();

Estoy viendo el siguiente error con este código: Index estaba fuera de los límites de la matriz .

Respuesta aceptada

El motivo del error: el índice estaba fuera de los límites de la matriz se debió a la forma en que Dapper dividía los segmentos de la respuesta de la consulta que se asignarán a través de los parámetros de devolución Publicar, Usuario e int en este ejemplo. La convención de Dapper es dividir en el ID del campo o proporcionar sus propias reglas para dividir el conjunto de resultados utilizando el parámetro splitOn .

Para hacer que el ejemplo anterior funcione:

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

    var data = connection.Query<Post, User, int, Post>(sql, (post, user, status) => { 
        post.Owner = user;
        post.SetSomeStatus(status);
        return post;
    });

    var post = data.First();

Encontré otra pregunta que también me ayudó: Corregir el uso de Multimapping en Dapper



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow