首先,我对dapper.net没有太多经验,也许这个问题很简单。
我想使用多映射功能。
我简化了我的问题。
我有2张桌子。
第一张表
CARS
列:
第二张表
品牌
列:
我需要执行此查询:
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")
正如我告诉不工作不工作的对象属性是空的,但如果我尝试简单插入,更新或删除它就可以了。
我现在很困惑哪里可以成为问题的根源。
答案 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>