选择带有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 ..我希望避免不得不投影层次结构的所有属性来得到我想要的,但也许这是不可能的
感谢您的帮助
这样的东西适合你吗?
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; }
}