使用linq选择带有已过滤子项的项目

时间:2014-06-18 14:52:37

标签: c# .net linq-to-objects

我有一个复杂的元素层次结构,我想根据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是服务的响应,其中包含酒店对象。 因而可以忽略..

所以要清楚(我希望),我需要酒店对象,下面有一个已过滤的孩子列表,这给我留下了一张最便宜的TotalPrice。 我希望避免必须预测层次结构的所有属性以获得我想要的但是也许不可能

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

这样的事情对你有用吗?

    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; }
}