选择带有linq的过滤子项的项

本文关键字:过滤 linq 选择 | 更新日期: 2023-09-27 18:09:25

我有一个复杂的元素层次结构,我想根据一个深度为4的子条目过滤下来。

下面是类

的示例
class Hotel {
    //other properties omitted for brevity 
    public List<Room> Rooms{get;set;}
}
class Room {
    //other properties omitted for brevity 
    public List<RoomType> RoomTypes{get;set;}
}
class RoomType {
    //other properties omitted for brevity 
    public List<Price> Prices {get;set;}
}
class Price {
    //other properties omitted for brevity 
    decimal TotalPrice{get;set;}
}

所以酒店的顶层有一些Rooms,其中有一些RoomTypes,其中有一些Prices

我想简单地过滤掉除了最便宜的TotalPrice和每个实例中的相关父级之外的任何内容,但保持层次结构在,留下一些带有房间,房间类型和最低价格的酒店

var filteredHotels = from hot in resp.Hotels
              let types = hot.Rooms.SelectMany(rooms => rooms.RoomTypes)
              let prices = types.SelectMany(t => t.Prices)
              select new {
                     hot
                     , types
                     , minPrice = prices.Min(p => p.TotalPrice)
              };

但这当然不行

作为对注释的响应,我需要层次结构中类的所有属性。我基本上只是想过滤掉多个昂贵的价格。你可能会认为单个房间的价格是单一的,但是每个房间的设置不同,所以它们的价格也不同。而且这不是我的等级制度,这是我正在消费的一项服务…抱歉,resp是来自服务的响应,其中包含hotels对象。因此可以忽略…

所以要清楚(我希望),我需要酒店对象,在它下面有一个过滤的儿童列表,让我在它下面有一个最便宜的TotalPrice ..我希望避免不得不投影层次结构的所有属性来得到我想要的,但也许这是不可能的

感谢您的帮助

选择带有linq的过滤子项的项

这样的东西适合你吗?

    var filteredHotels = resp.Hotels.Select(h =>
                            h.Rooms.Select(r =>
                            r.RoomTypes.Select(rt =>
                            new
                            {
                                HotelName = h.Name,
                                RoomName = r.Name,
                                RoomTypeName = rt.Name,
                                MinPrice = rt.Prices.Min(p => p.TotalPrice)
                            })));

假设你所有的类都有Name属性。你可以用任何你想要的来替换这个属性。

class hotel
{
    public string Name { get; set; }
    //other properties omitted for brevity 
    public List<Room> Rooms { get; set; }
}
class Room
{
    public string Name { get; set; }
    //other properties omitted for brevity 
    public List<RoomType> RoomTypes { get; set; }
}
class RoomType
{
    public string Name { get; set; }
    //other properties omitted for brevity 
    public List<Price> Prices { get; set; }
}
class Price
{
    public string Name { get; set; }
    //other properties omitted for brevity 
    public decimal TotalPrice { get; set; }
}