Сопоставить столбцы SQL в SqlMapper.Query<T1, T2, TReturn> со свойствами класса

Во-первых, у меня нет большого опыта работы с dapper.net, и, возможно, эта проблема имеет простое решение.

Я хотел бы использовать мульти картографические функции.

Я упростил мою проблему.

У меня есть 2 таблицы.

Первый стол

МАШИНЫ

Колонки:

  • CARD_ID (PK)
  • CAR_LOCATION
  • CAR_STATUS

Второй стол

БРЕНДЫ

Колонки:

  • ID (PK)
  • CARD_ID (FK)
  • НАЗВАНИЕ БРЕНДА
  • BRAND_LOGO

Мне нужно выполнить этот запрос:

SQL_CMD:

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

В приложении.NET я отображаю эти таблицы на 2 класса 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;}
}

Когда я запрашиваю sql cmd выше:

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

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

Я получаю пустой результат.

ИМХО проблема заключается в сопоставлении столбцов SQL со свойствами класса, потому что, если я изменил prop Card.CarId на Car.CAR_ID, эти свойства будут заполнены.

Есть ли способ сопоставить "столбцы SQL" со свойствами класса в SqlMapper.Query<T1,T2,TReturn> к свойствам класса?

Я знаю что существует ClassMapper но я не нашел способ использовать в этом сценарии.

Спасибо

Редакция:

Я пытался добавить сопоставление классов, но не работает

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

добавить сопоставления сборок

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

и после этого настроить выполнение запроса

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

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

Как я уже сказал, не работает, не работает свойства объектов пусты, но если я попытался просто вставить, обновить или удалить, это работает.

Я сейчас запутался, где может быть корень проблемы.

1 ответ

Dapper Extensions предоставляет 4 расширения: Get, Insert, Update и Delete, так что ваш второй пример не сработает. Расширение запроса является частью ядра Dapper. Насколько я могу судить, Dapper Extensions не поддерживает мульти-картографирование.

Единственный вариант, о котором я могу подумать, - это изменить оператор select и переименовать атрибуты, например:

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

Тогда мультикартирование должно работать.

Кроме того, вам не нужно указывать splitOn, если вы разделяете по ID. Dapper расщепляется на поля Id автоматически.

Dapper предполагает, что ваши столбцы Id называются "Id" или "id", если ваш первичный ключ отличается или вы хотите разделить широкую строку в точке, отличной от "Id", используйте необязательный параметр "splitOn".

Другие вопросы по тегам