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。
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。