基于LINQ中的子列表计数来限制对象

时间:2011-08-24 13:01:05

标签: linq linq-to-sql linq-to-xml

由于某种原因,我很好并且真的卡住了。我有一堆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)

希望能让它更清晰

由于

1 个答案:

答案 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)
    }
);