Petapocoのマルチマッピングで複数のJOINを処理できますか?

dapper join mapping petapoco

質問

私はPetapocoを使って塗りつぶすリストオブジェクトを持っています。

クラスのプロパティと名前がデータベーススキーマを処理しています。主なクラスはIssueであり、名前とプロパティがデータベーススキーマと一致する2つの他のクラス( ConditionSeverityLevel)に関連しています。

public class Issue
{
    public int Id { get; set; } // Primary key

    /* Some properties... */
    public DateTime? CreatedOn { get; set; }
    public string CreatedBy { get; set; }
    public DateTime? ModifiedOn { get; set; }
    public string ModifiedBy { get; set; }

    /* ... */

    // Related source and target conditions
    [PetaPoco.Ignore]
    public Condition SourceCondition { get; set; }

    [PetaPoco.Ignore]
    public Condition TargetCondition { get; set; }

    // Related severity level
    [PetaPoco.Ignore]
    public SeverityLevel CurrentSeverityLevel { get; set; }
}

public class Condition
{
    public int Id { get; set; } // Primary Key
    public string Description  { get; set; }
}

public class SeverityLevel
{
    public int Id { get; set; } // Primary key
    public string Description { get; set; }
    public string HexColorDisplay { get; set; }
}

実際には、問題のリストを取得するときに、マルチマップ機能を使用して、 問題リストと関連するSeverityLevelを単一のコマンドを使用して取得しています。

var Results = Db.Fetch<Issue, SeverityLevel, Issue>(
    (i, sl) => { 
        i.CurrentSeverityLevel = sl;
        return i;
    },
    "SELECT /* ..shortened.. */ FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "WHERE Issue.Id=@0", issueId);

さて、Petapocoは複数のJOINSを処理しているようには見えないので、検索した各問題にSourceConditionTargetConditionを付けるためには2番目のステップを実行する必要があります。

そうするために、私は次のいずれかを行うことができます:

  • foreachループで読み取りの後にSource条件とTarget条件を添付し、
  • または条件のリスト全体を取得してから、同じ種類のfor-eachを使用して各Issueにアタッチします。

今のところ、データベースには条件のセットが限られているため、2番目のソリューションを使用しています。

とにかく、JOINEDテーブルが追加されるのと同じくらい多くのクエリを実行する必要があるため、この方法では少し重いように思えます。

私はこのような仕事をするために達成できるかどうか疑問に思います。

var Results = Db.Fetch</* ????? */>(
    /* ???? */
    "SELECT /* ..shortened.. */ FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "LEFT JOIN Condition Con1 ON Con1.Id = Issue.SourceConditionId " + 
    "LEFT JOIN Condition Con2 ON Con2.Id = Issue.TargetConditionId " + 
    "WHERE Issue.Id=@0", issueId);

親愛なるPetapocoのユーザー、親愛なるPetapocoの著者、これはこれを処理する方法ですか?

Dapperを使ってこれを代わりに使うことができますか(もし可能ならば)、私は絶対に私の更新/挿入操作のためにPetapocoを保持したいと思いますか?

受け入れられた回答

これはできるはずです。

var Results = Db.Fetch<Issue, SeverityLevel, Condition, Condition, Issue>(
    (i, sl, c1, c2) => { 
        i.CurrentSeverityLevel = sl;
        i.SourceCondition = c1;
        i.TargetCondition = c2;
        return i;
    },
    "SELECT Issue.*, SeverityLevel.*, Con1.*, Con2.* FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "LEFT JOIN Condition Con1 ON Con1.Id = Issue.SourceConditionId " + 
    "LEFT JOIN Condition Con2 ON Con2.Id = Issue.TargetConditionId " + 
    "WHERE Issue.Id=@0", issueId);

私はこれをテストしていない。私はこれを自動化する方法にも取り組んでいます。

これは、選択した列は、パラメータの種類があるのと同じ順序になっていることは本当に重要です。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow