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

时间:2013-02-05 12:36:31

标签: petapoco 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列和两个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的值。 是否可以或者我必须写两次数据库调用并自己做一些手动映射?

1 个答案:

答案 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; }
}