次のコードを使用して、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 つの呼び出しを作成し、自分で手動マッピングを行う必要がありますか?