由于某种原因,我很好并且真的卡住了。我有一堆XML,通过linq,我调整到适合我的DTO对象,这工作正常,但我需要一个额外的过滤器,只返回有一段时间内完全可用的房间的房间类型。
现在我的原始查询设置DTO工作正常,但我想添加一些东西,只返回有整个时期可用率的房间,所以说你想预订10天,你应该只得到房间返回有完整10天的类型。我的原始查询如下:
var items = (
from rt in data.Descendants("RoomType")
select new RoomType
{
name = rt.Descendants("RoomDescription").Descendants("Text").SingleOrDefault().Value,
rooms = (
from r in rt.Descendants("Room")
select new Room
{
Name = r.Attribute("id").Value,
rates = (
from rr in r.Descendants("RoomRate")
where DateTime.Parse(rr.Attribute("EffectiveDate").Value) >= startDate
where DateTime.Parse(rr.Attribute("EffectiveDate").Value) <= endDate
select new RoomRate
{
EffectiveDate = DateTime.Parse(rr.Attribute("EffectiveDate").Value)
})
})
});
如果完全可能在此查询中具有令人惊讶的限制,但我无法看到如何做到这一点。
当我试图在此背后创建另一个查询时,我不知道如何从RoomType对象查询Rooms.RoomRates的数量以返回。我试过了
var result = items.Where(i => i.rooms.Where(r => r.rates.Count() == 10));
但是这给了我一个异常,它无法将IEnumerable转换为bool,.Any()编译但返回所有内容(可能是预期的)。
有谁知道我在这里做错了什么?
编辑:**这就是目前拉出数据的方式
房间类型:单身 - 1号房(可用天数10) - 2号房(可用天数10)
房间类型:双床房 - 3号房(可用天数10) - 4号房(可用日期4)
我想要做的是将房间4排除在外,因为它不符合日期标准
所以我应该回来的是:
房间类型:单身 - 1号房(可用天数10) - 2号房(可用天数10) 房间类型:双床房 - 3号房(可用天数10)
希望能让它更清晰
由于
答案 0 :(得分:1)
如果你只想要Room
s,你可以展平集合,然后过滤它:
IEnumerable<Room> rooms = items.SelectMany(i => i.Rooms)
.Where(r => r.rates.Count() == 10)
如果您想要RoomTypes,则需要使用已过滤的RoomType
创建新的Rooms
个对象:
var types = items.Select(i =>
new RoomType {
name = i.name,
rooms = i.rooms.Where(r => r.rates.Count() == 10)
}
);