我已经成功地用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列和两个日期时间列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的值。这可能吗?还是我必须写两个对数据库的调用,并自己进行一些手动映射?
由于这实际上是Period上的一个外部联接,其中Period有时为null,所以将您的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; }
}