ограничить объекты на основе количества подсписков в LINQ - PullRequest
0 голосов
/ 24 августа 2011

Я хорошо и действительно застрял по какой-то причине. У меня есть набор 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)
                    })
            })
    });

если вообще возможно иметь ограничение в этом запросе, это было бы удивительно, но я не мог понять, как это сделать.

Когда я пытался создать еще один запрос на его основе, я не знал, как можно запросить счетчик Rooms.RoomRates из объекта RoomType для возврата. я пытался

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 Ответ

1 голос
/ 24 августа 2011

Если вы хотите только 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)
    }
);
...