C# Linq IQueryable select 扁平嵌套对象列表

C# Linq IQueryable select flattened nested object list

public class Parent
{
    public int ParentId { get; set; }
    public string ParentPropertyA { get; set; }
    public string ParentPropertyA { get; set; }
    public List<Child> Children{get; set;}

}

public class Child
{
    public int ChildId { get; set; }
    public string ChildPropertyA { get; set; }
    public string ChildPropertyB { get; set; }
}

private static Expression<Func<Parent, dynamic>> BuildModel()
{
    return x => new
    {
        x.ParentId,
        x.Children
    };
}

我在 IQueryable.Select(BuildModel())

上使用了这个表达式

假设我有一个 Parent 对象,其中有两个 Children... 鉴于该结构,我如何实现返回具有所有 Parent 属性和特定 Children 的两条记录,而不是仅返回一个 Parent 和两个 Children?

示例:

{
  ParentId: 1,
  ParentPropertyA: "parentA",
  ParentPropertyB: "parentB",
  Children:
  [
    {
      ChildId: 1,
      ChildPropertyA: "childA1",
      ChildPropertyB: "childB1"
    },
    {
      ChildId: 2,
      ChildPropertyA: "childA2",
      ChildPropertyB: "childB2"
    }
  ]
}

相反,我希望将它们返回为:

[
  {
    ParentId: 1,
    ParentPropertyA: "parentA",
    ParentPropertyB: "parentB",
    ChildId: 1,
    ChildPropertyB: "childB1"
  },
  {
    ParentId: 1,
    ParentPropertyA: "parentA",
    ParentPropertyB: "parentB",
    ChildId: 2,
    ChildPropertyB: "childB2"
  }
]

这可能吗?谢谢!

DTO class:

public class DTO
{
   public int ParentId { get; set; }
   public string ParentPropertyA { get; set; }
   public string ParentPropertyB { get; set; }
   public int ChildrenId { get; set; }
   public string ChildrenPropertyB { get; set; }
}

用法:

var parent = GetParent() //Get Parent instance

List<Dto> dtos = parent.Childrens.Select(q => new DTO
{
    ParentId = parent.ParentId,
    ParentPropertyA = parent.ParentPropertyA
    ParentPropertyB = parent.ParentPropertyB,
    ChildrenId = q.ChildrenId,
    ChildrenPropertyB = q.ChildrenPropertyB
})
.ToList();

对 parent 集合使用 SelectMany。在 SelectMany 表达式中,select children,并将其与 parent.

的副本配对
var flattenedList = parents.SelectMany
(
    p => p.Children.Select
    (
        c => new { Parent = p, Child = c } 
    )
);

这将为每个 child 提供一个元素,并根据需要复制 parents。