Daryl VaDazzle McAllister Ответов: 1

Выражение Linq для проверки наличия номера на определенные даты.


Эй там

Я пытаюсь создать систему, в которой пользователь будет вводить дату прибытия и дату отъезда, а также тип номера, который он хочет иметь, затем программа проверит, доступны ли ему какие-либо номера этого типа, а затем, если да, то вернет номера номеров.

Это моя модель представления:
[модель представления]

Это стол в моей комнате:
[КОМНАТЫ]

Это мой столик для бронирования
[БРОНИРОВАНИЕ]

И это мое мнение
[CheckView]

Проблема в том, что я не знаю, как использовать выражение LINQ для получения номеров номеров с теми же типами номеров, что и указано, но которые не являются частью какого-либо бронирования в течение выбранных дат.

Самое близкое, что я получил, - это использование того же выражения LINQ, которое я использую при создании резервирования, чтобы проверить, занято ли оно в течение этих дат в admin CRUD. Это выражение:

<pre>  
          
var currentBooking = db.Reservations

.Where(b => b.RoomId == CurrentReservation.RoomId)
.Select(b => (b.Arrival <= CurrentReservation.Arrival &&
               b.Depature >= CurrentReservation.Arrival) ||
               (b.Arrival < CurrentReservation.Depature && b.Depature >= 
                                           CurrentReservation.Depature)||
               (CurrentReservation.Arrival <= b.Arrival                              
                                      && CurrentReservation.Depature >= b.Arrival))
.FirstOrDefault();


Тем не менее, попытка изменить это, чтобы соответствовать моей ситуации, поставила меня в тупик, и любая помощь будет оценена.

Что я уже пробовал:

Я пытался использовать конвертер SQL в linq и потерпел неудачу.
Многие попытки чисто сырого SQl просто приводили к ошибкам или ложным возвратам.

1 Ответов

Рейтинг:
4

Richard Deeming

В зависимости от того, как настроены ваши Сущности, должно работать что-то вроде этого:

string desiredRoomType = ...;
DateTime arrivalDate = ...;
DateTime departureDate = ...;

var matchingRooms = db.Rooms
    .Where(room => room.RoomType == desiredRoomType)
    .Where(room => room.Reservations.All(res => res.Departure < arrivalDate || res.Arrival > departureDate))
;

(Вы также можете написать это как !room.Reservations.Any(res => res.Departure >= arrivalDate && res.Arrival <= departureDate), но я думаю, что это чище использовать All вместо.)

Эквивалентом в SQL будет:
SELECT
    Id,
    RoomCosts,
    Room_Type,
    RoomNumber
FROM
    dbo.Rooms As R
WHERE
    Room_Type = @RoomType
And
    Not Exists
    (
        SELECT 1
        FROM dbo.Reservations As B
        WHERE B.RoomId = R.Id
        And B.Departure >= @ArrivalDate
        And B.Arrival <= @DepartureDate
    )


Maciej Los

5ед!