1

首先,我对 dapper.net 没有太多经验,也许这个问题有简单的解决方案。

我想使用多映射功能。

我简化了我的问题。

我有 2 张桌子。

第一张桌子

汽车

列:

  • CARD_ID (PK)
  • CAR_LOCATION
  • CAR_STATUS

第二张桌子

品牌

列:

  • 身份证(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")

正如我所说的不起作用,对象的属性是空的,但如果我尝试简单的插入、更新或删除,它就可以工作。

我现在很困惑哪里可能是问题的根源。

4

1 回答 1

1

Dapper Extensions 提供了 4 个扩展:获取、插入、更新和删除,因此您的第二个示例将不起作用。查询扩展是核心 Dapper 的一部分。据我所知,Dapper Extensions 不支持多重映射。

我能想到的唯一选择是修改您的选择语句并重命名属性,例如:

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

然后多重映射应该可以工作。

此外,如果您按 ID 拆分,则无需指定 splitOn。Dapper 会自动在 Id 字段上拆分。

Dapper 假设您的 Id 列被命名为“Id”或“id”,如果您的主键不同,或者您想在“Id”以外的点拆分宽行,请使用可选的“splitOn”参数。

于 2013-12-24T17:55:32.737 回答