当孩子们有自己的映射要做时,在NPoco中获取多个



我已经成功地用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; }
}

最新更新