Mappare le colonne SQL in SqlMapper.Query alle proprietà di classe

dapper dapper-extensions join mapping

Domanda

Per prima cosa non ho molta esperienza con dapper.net e forse questo problema ha una soluzione semplice.

Vorrei utilizzare le funzionalità di mappatura multipla.

Ho semplificato il mio problema.

Ho 2 tavoli.

Primo tavolo

AUTOMOBILI

colonne:

  • CARD_ID (PK)
  • CAR_LOCATION
  • CAR_STATUS

Secondo tavolo

MARCHE

colonne:

  • ID (PK)
  • CARD_ID (FK)
  • MARCHIO
  • BRAND_LOGO

Ho bisogno di eseguire questa query:

SQL_CMD:

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

Nell'applicazione .NET I mappa queste tabelle su 2 classi 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;}
}

Quando interrogo sql cmd sopra:

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

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

Ottengo risultato vuoto.

Il problema di IMHO è nella mappatura delle colonne SQL sulle proprietà della classe, perché se ho cambiato il prop Card.CarId in Car.CAR_ID queste proprietà sono riempite.

Esiste un modo per mappare "colonne SQL" alle proprietà della classe in SqlMapper.Query<T1,T2,TReturn> alle proprietà della classe?

So che esiste ClassMapper ma non ho trovato il modo di utilizzare in questo scenario.

Grazie

MODIFICATO:

Ho provato ad aggiungere classi di mappatura, ma non lavoro

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

aggiungere assiemi di mappatura

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

e dopo questa configurazione eseguire query

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

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

Come ho detto non funziona, non funzionano le proprietà degli oggetti sono vuote, ma se ho provato semplice inserimento, aggiornamento o eliminazione funziona.

Sono confuso ora dove può essere la radice del problema.

Risposta popolare

Dapper Extensions fornisce 4 estensioni: Get, Insert, Update e Delete, quindi il tuo secondo esempio non funzionerà. L'estensione della query è una parte del core Dapper. Per quanto posso dire, Dapper Extensions non supporta il multi-mapping.

L'unica opzione che posso pensare è di modificare l'istruzione select e rinominare gli attributi, ad esempio:

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

Quindi la multi-mappatura dovrebbe funzionare.

Inoltre, non è necessario specificare splitOn se si sta dividendo per ID. Dapper si divide automaticamente in campi ID.

Dapper presuppone che le tue colonne Id siano denominate "Id" o "id", se la tua chiave primaria è diversa o se desideri dividere la riga larga in un punto diverso da "Id", utilizza il parametro opzionale "splitOn".



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché