Dapper Multi Mapping Result

dapper

Pregunta

Tengo dos clases

public class Customer
{
    public int CustomerId { get; set;}
    public string CustomerName { get; set; }
}

public class Order
{
    public int OrderId { get; set; }
    public int CustomerId { get; set; }       //BuyerCustomer
    public int CustomerSecondId { get; set; } //ReceiverCustomer
    public Customer BuyerCustomer { get; set; }
    public Customer ReceiverCustomer { get; set; }
}

Aquí está mi consulta se verá

SELECT a.*, b.*, c.* FROM dbo.PRODUCTS_ORDER a
INNER JOIN  dbo.CUSTOMER b ON a.CustomerId=b.CustomerId
INNER JOIN   dbo.CUSTOMER c ON a.CustomerSecondId=b.CustomerId

Dapper Implementation ..

     List<Order> order= null;
 order= (List<Order>)dapperconnection.Query<Order, Customer, Customer, Order>(sql,
                                (order, customer1,customer2) =>
                                {
                                    order.BuyerCustomer = customer1;
                                    order.ReceiverCustomer = customer2;
                                    return order;
                                }, splitOn: "CustomerId,CustomerSecondId ");

El resultado que obtengo es incompleto, solo se llena el Cliente de Recevier mientras que el Cliente comprador no contiene ningún valor.

Parece que dapper está confundido ya que utilicé CustomerId dos veces en mi consulta. ¿Hay alguna solución con esto sin tener que cambiar mi clase de Cliente?

Respuesta aceptada

Hay pocos problemas con su diseño de clase y la consulta Dapper.

  • Customer.CustomerName debería ser una cadena
  • Quitaría CustomerId y CustomerSecondId de Order. Ellos son redundantes. Tienes ambas Id's en el Cliente.
  • Eliminar CustomerSecondId de Split.

A continuación hay una prueba de trabajo:

public class Order
{
    public int OrderId { get; set; }
    public Customer BuyerCustomer { get; set; }
    public Customer ReceiverCustomer { get; set; }
}

public class Customer
{
    public int CustomerId { get; set; }
    public string CustomerName { get; set; }
}


[Test]
public void TestSplitMany()
{
    using (var conn = new SqlConnection(@"Data Source=.\sqlexpress;Integrated Security=true; Initial Catalog=foo"))
    {
        var result =
            conn.Query<Order, Customer, Customer, Order>(@"select OrderId = 1, CustomerId = 2, CustomerName = 'Jim', CustomerId = 3, CustomerName = 'Bob'",
                (order, buyer, receiver) =>
                {
                    order.BuyerCustomer = buyer;
                    order.ReceiverCustomer = receiver;
                    return order;
                }, splitOn: "CustomerId").First();

        Assert.That(result.BuyerCustomer.CustomerId == 2);
        Assert.That(result.ReceiverCustomer.CustomerId == 3);

        Assert.That(result.BuyerCustomer.CustomerName == "Jim");
        Assert.That(result.ReceiverCustomer.CustomerName == "Bob");
    }
}


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é