Asignar columnas SQL en SqlMapper.Query a las propiedades de clase

dapper dapper-extensions join mapping

Pregunta

Primero, no tengo mucha experiencia con dapper.net y tal vez este problema tenga una solución simple.

Me gustaría utilizar funciones de mapeo múltiple.

Simplifiqué mi problema.

Tengo 2 tablas.

Primera mesa

CARROS

Columnas:

  • CARD_ID (PK)
  • CAR_LOCATION
  • CAR_STATUS

Segunda mesa

MARCAS

Columnas:

  • ID (PK)
  • CARD_ID (FK)
  • NOMBRE DE LA MARCA
  • LOGOTIPO

Necesito ejecutar esta consulta:

SQL_CMD:

SELECT * FROM CARS
LEFT JOIN BRANDS
ON CARS.CARD_ID = BRANDS.CARD.ID;

En la aplicación .NET mapeo estas tablas en 2 clases de POCO.

public class Car
{
  public int CarId {get;set}
  public string CarLocation {get;set;}
  public string CarStatus {get;set;} 
  public Brand Brand {get;set;}
}

public class Brand
{
  public int Id {get;set}
  public int CardId {get;set;}
  public string BrandName {get;set;}
  public string BrandLogo {get;set;}
}

Cuando consulto sql cmd arriba:

        var data = connection.Query<Car, Brand, Car>(SQL_CMD, (car, brand) =>
        {
            car.Brand = brand;
            return car;

        }, commandTimeout: 50000, splitOn:"ID")

Obtengo un resultado vacío

En mi humilde opinión, el problema es mapear columnas SQL en las propiedades de la clase porque si cambio prop. Cargar a Car.CAR_ID, estas propiedades se completan.

¿Hay alguna manera de asignar "columnas SQL" a las propiedades de la clase en SqlMapper.Query<T1,T2,TReturn> a las propiedades de la clase?

Sé que existe ClassMapper pero no encontré la manera de usarlo en este escenario.

Gracias

EDITADO:

Intenté agregar clases de mapeo, pero no trabajo

public class CarMapper : ClassMapper<Car>
{
   Table("CARS");
   Map(c=>c.CarId).Column("CAR_ID").KeyType(KeyType.Assigned);
   Map(c=>c.CarLocation).Column("CAR_LOCATION");
   Map(c=>c.CarStatus).Column("CAR_STATUS");
}

public class BrandMapper : ClassMapper<Brand>
{
   Table("BRANDS");
   Map(c=>c.Id).Column("ID").KeyType(KeyType.Assigned);
   Map(c=>c.CarId).Column("CAR_ID");
   Map(c=>c.BrandName).Column("BRAND_NAME");
   Map(c=>c.BrandLogo).Column("BRAND_LOGO");
}

agregar conjuntos de mapeo

DapperExtensions.DapperExtensions.SetMappingAssemblies(new List<Assembly>
{
    Assembly.GetAssembly(typeof(CarMapper)), 
    Assembly.GetAssembly(typeof(BrandMapper)),                                                         
});

y después de esta configuración ejecutar consulta

    var data = connection.Query<Car, Brand, Car>(SQL_CMD, (car, brand) =>
    {
        car.Brand = brand;
        return car;

    }, commandTimeout: 50000, splitOn:"ID")

Como dije no funciona, las propiedades de los objetos que no funcionan están vacías, pero si lo intenté, simplemente inserte, actualice o elimine.

Estoy confundido ahora donde puede ser la raíz del problema.

Respuesta popular

Dapper Extensions proporciona 4 extensiones: Obtener, Insertar, Actualizar y Eliminar, por lo que su segundo ejemplo no funcionará. La extensión de consulta es una parte de Core Dapper. Por lo que puedo decir, Dapper Extensions no es compatible con multi-mapping.

La única opción que puedo pensar es modificar tu declaración de selección y renombrar los atributos, por ejemplo:

SELECT CAR_ID as CarId, CAR_LOCATION as CarLocation, CAR_STATUS as CarStatus, etc.
FROM CARS
LEFT JOIN BRANDS
ON CARS.CARD_ID = BRANDS.CARD.ID

Entonces el mapeo múltiple debería funcionar.

Además, no necesita especificar splitOn si está dividiendo por ID. Dapper se divide en los campos Id automáticamente.

Dapper supone que sus columnas Id se llaman "Id" o "id", si su clave principal es diferente o si desea dividir la fila ancha en un punto que no sea "Id", utilice el parámetro opcional "splitOn".



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