2

次のコードを使用して、NPoco FetchManyToOne を使用して親とその子をフェッチすることに成功しました。

public class Parent
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IList<Child> Children { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public int ParentId { get; set; }
    public string Name { get; set; }
}

db.FetchOneToMany<Parent, Child>(parent => parent.Id, child => child.Id,
                    @"SELECT
                        P.Id, P.Name,

                        C.Id, C.ParentId, C.Name
                    FROM Parent AS P
                        LEFT JOIN Child AS C ON P.Id = C.ParentId",
                    id);

現在、子供が期間に属することができるこのシナリオがあります。これはオプションであるため、子は期間に属している必要はありません。データベースでは、Period テーブルは id 列と 2 つの datetime 列 (Start と End) で構成されています。子テーブルには新しい列 PeriodId があり、期間に属していない場合は null 値を含めることができます。

クラス Child は、Period 型の新しいプロパティを取得します。これは、null またはクラス Period のインスタンスにすることができます。クラス構造への変更を見てください。

public class Parent
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IList<Child> Children { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public int ParentId { get; set; }
    public string Name { get; set; }

    public Period ChildPeriod { get; set; }
}

public class Period
{
    public int Id { get; set; }
    public DateTime Start { get; set; }
    public DateTime End { get; set; }
}

この sql を自分のクラスにマップするにはどうすればよいですか?

@"SELECT
                        P.Id, P.Name,

                        C.Id, C.ParentId, C.Name,

                        PE.Id, PE.Start, PE.End
                    FROM Parent AS P
                        LEFT JOIN Child AS C ON P.Id = C.ParentId
                        LEFT JOIN Period AS PE ON C.PeriodId = PE.Id"

そのため、子が期間の一部である場合、その期間はクラス Child のプロパティ ChildPeriod の値になります。それは可能ですか、それともデータベースへの 2 つの呼び出しを作成し、自分で手動マッピングを行う必要がありますか?

4

1 に答える 1

0

これは実際には Period が null になる場合がある Period の外部結合であるため、 Child クラスを次のように実行します。

public class Child
{
  public int Id { get; set; }
  public int ParentId { get; set; }
  public string Name { get; set; }

  [ResultColumn] public DateTime? Start { get; set; }
  [ResultColumn] public DateTime? End { get; set; }
}
于 2013-02-08T23:31:00.003 に答える