我想从所有嵌套实体中获取一个ID列表。
代码:
// Entities
class Floor
{
public int Id { get; set; }
public ICollection<Room> Rooms { get; set; } = new List<Room>();
}
class Room
{
public int Id { get; set; }
public ICollection<Chair> Chairs { get; set; } = new List<Chair>();
}
class Chair
{
public int Id { get; set; }
}
// Setup
var floor = new Floor() { Id = 1000 };
var room = new Room() { Id = 100 };
var chair = new Chair() { Id = 10 };
room.Chairs.Add(chair);
floor.Rooms.Add(room);
var floors = new List<Floor>() { floor };
// Select all IDs
var ids = floors.???
预期结果:
{ 10, 100, 1000 }
我试过了。它只从最底层选择ID,而不是所有的:
// Select all IDs
var ids = floors
.SelectMany(f => f.Rooms)
.SelectMany(r => r.Chairs)
.Select(ch => ch.Id)
.ToList();
4条答案
按热度按时间neekobn81#
SelectMany
是与Append
一起使用时所需的:qlvxas9a2#
当前代码将层次结构扁平化为
Chair
的集合,并只选择它们的id。对于纯LINQ,您可以通过嵌套
SelectMany
并使用Append
/Prepend
来完成:bxjv4tth3#
一个丑陋的黑客将附加“假货”的儿童房间/椅子与他们的父母的ID:
vlju58qv4#
这可以通过递归helper函数来完成,如下所示:
用法:
您可以考虑将此函数提取到一个公共接口中,以避免笨拙的类型切换和递归。