2013-12-20 54 views
1

首先,我沒有與dapper.net太多的經驗,也許這個問題有簡單的解決方案。地圖SQL列類屬性

我想使用多映射功能。

我簡化了我的問題。

我有2個表。

第一表

CARS

色譜柱:

  • card_id的(PK)
  • CAR_LOCATION
  • CAR_STATUS

個第二表

BRANDS

色譜柱:

  • 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

Dapper擴展提供了4個擴展:獲取,插入,更新和刪除,所以你的第二個例子不會工作。查詢擴展是核心Dapper的一部分。據我所知,Dapper擴展不支持多映射。

我能想到的唯一的選擇是修改你的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字段上分割。

小巧玲瓏假設您的ID列被命名爲「ID」或「身份證」,如果你的主鍵不同,或者您想在寬行以比「ID」,使用可選的「splitOn」另一點拆分參數。