8

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 を処理しないように見えるため、取得した各 Issue にSourceConditionTargetConditionをアタッチする 2 番目のステップを実行する必要があります。

そうするには、次のいずれかを実行できます。

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

データベース内の条件のセットが限られているため、今のところ、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 を使用してこれを処理できますか?

4

1 に答える 1

13

これはできるはずです。

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

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

選択した列がパラメーターの型と同じ順序であることが非常に重要です

于 2011-07-12T14:25:04.330 に答える