首先,我对 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")
正如我所说的不起作用,对象的属性是空的,但如果我尝试简单的插入、更新或删除,它就可以工作。
我现在很困惑哪里可能是问题的根源。