Asigna objetos secundarios con Dapper

c# dapper

Pregunta

Estoy intentando devolver un pedido con las líneas de pedido que pertenecen al pedido. Actualmente, solo se devuelve un artículo de línea, incluso si hay más de uno. Eso es porque estoy llamando a FirstOrDefault()

El resultado variable tiene dos registros. La única diferencia entre los dos es el SKU y la cantidad.

¿Cómo mapeo los elementos de línea? El objeto de pedido contiene una lista de LineItem y necesito que se agreguen todos.

public async Task<IOrder> ReadAsync(int orderId)
{
  var result = await WithConnection(async c => await c.QueryAsync<Order, LineItem, Order>("_Orders_LineItems_ReadByOrderID", 
    (order, lineitem) =>
    {
      if (order.LineItems == null) order.LineItems = new List<ILineItem>();
      order.LineItems.Add(lineitem);
      return order;
    }, new { orderId }, commandType: CommandType.StoredProcedure, splitOn: "LineItemID"));

  return result.FirstOrDefault();   
}

Respuesta popular

Al utilizar el mapeo múltiple, NO PUEDE gestionar la relación 1: N, ya que está tratando de hacer haciendo un pedido con más de un elemento de línea.

Obtenga más información aquí si está interesado: https://medium.com/dapper-net/multiple-mapping-d36c637d14fa

Tienes dos opciones para resolver el problema:

1) cambie el procedimiento almacenado para devolver dos conjuntos de resultados: 1 para la orden, 1, con "n" líneas, con las líneas de pedido asociadas, y luego lea cada conjunto de resultados (Dapper admite esta función: https://medium.com / dapper-net / handling-multiple-resultsets-4b108a8c5172 ) en objetos Order y LineItem.

2) cambie el procedimiento almacenado para devolver un JSON que devuelva las órdenes con elementos de línea anidados. A continuación, puede convertir JSON en su objeto.

Mi fuerte sugerencia es la segunda opción si está usando SQL Server 2016 y después de eso es compatible con JSON de forma nativa.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué