我成功地使用以下代码使用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列和两个datetime列,Start和End。 Child表有一个新列PeriodId,如果它不属于句点,则可以包含空值。
类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的值。 是否可以或者我必须写两次数据库调用并自己做一些手动映射?
答案 0 :(得分:0)
由于这确实是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; }
}