SqlMapper.QueryのSQL列をマップするクラスプロパティへ

dapper dapper-extensions join mapping

質問

まず、dapper.netの経験があまりなく、この問題には単純な解決策があります。

私はマルチマッピング機能を使用したいと思います。

私は自分の問題を単純化した。

私は2つのテーブルを持っています。

最初のテーブル

列:

  • CARD_ID(PK)
  • CAR_LOCATION
  • CAR_STATUS

二番目のテーブル

ブランド

列:

  • ID(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")

私は空の結果を得る。

私がProp.CarIdをCar.CAR_IDに変更した場合、このプロパティは満たされているので、IMHOの問題はクラスのプロパティのSQLカラムをマッピングすることにあります。

SqlMapper.Query<T1,T2,TReturn>クラスプロパティに "SQL列"をクラスプロパティにマップする方法はありますか?

私はClassMapperが存在することを知っていClassMapperが、私はこのシナリオでどのように使用するかを見つけませんでした。

ありがとう

EDITED:

私はマッピングクラスを追加しようとしましたが、動作しませんでした

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")

私はオブジェクトのプロパティが空ではない仕事をしないと言いましたが、単純な挿入、更新、削除を試してみるとうまくいきます。

私はどこで問題の根源になるのか今混乱している。

人気のある回答

Dapper Extensionsには、Get、Insert、Update、Deleteの4つの拡張が用意されているため、2つ目の例は動作しません。クエリ拡張機能は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"以外の場所でワイド行を分割したい場合は、オプションのsplitOnパラメータを使用して、Id列の名前が "Id"または "id"であることを前提としています。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ