将SqlMapper.Query <t1,t2,treturn>中的SQL列映射到类属性</t1,t2,treturn>

时间:2013-12-20 21:06:30

标签: join mapping dapper dapper-extensions

首先,我对dapper.net没有太多经验,也许这个问题很简单。

我想使用多映射功能。

我简化了我的问题。

我有2张桌子。

第一张表

CARS

列:

  • CARD_ID(PK)
  • CAR_LOCATION
  • CAR_STATUS

第二张表

品牌

列:

  • ID(PK)
  • CARD_ID(FK)
  • BRAND_NAME
  • 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列,因为如果我将支持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 个答案:

答案 0 :(得分:1)

Dapper Extensions提供4个扩展:获取,插入,更新和删除,因此您的第二个示例不起作用。查询扩展是核心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

然后多映射应该有效。

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

  

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