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


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())上使用此表达式

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

例:

{
  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"
  }
]

这可能吗?谢谢!

对父集合使用 SelectMany。在 SelectMany 表达式中,选择子项,并将其与父项的副本配对。

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

这将为每个孩子提供一个元素,并根据需要复制父母。

DTO 类:

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();

最新更新