2

我已经成功地使用 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 组成。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 的值。是否有可能或者我必须编写两个对数据库的调用并自己进行一些手动映射?

4

1 回答 1

0

由于这实际上是 Period 的外部联接,其中 Period 有时会为空,因此您的 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; }
}
于 2013-02-08T23:31:00.003 回答