Я использую ASP.NET MVC и EF для создания приложения бронирования автомобилей, в котором пользователь сможет зарезервировать несколько автомобилей на одну дату и время, если они захотят.Я создал хранимую процедуру для предотвращения двойного бронирования транспортных средств, но у меня возникают проблемы с поиском того, как добавить результаты в список.
Пример: я хочу зарезервировать автомобиль № 1 и автомобиль № 2 на 18.12.2008 г. с 12:00 до 13:00 .... хранимая процедура переходит к базе данных, чтобы узнать, что автомобиль № 1уже зарезервировано с 12:00 до 13:00, но автомобиль № 2 не зарезервирован.Из-за запуска foreach
, alreadyReservedVehicle
возвращается с результатом .Count() = 0
, потому что он видит последний результат, который заключается в том, что Автомобиль № 2 не зарезервирован.Должно появиться сообщение об ошибке, в котором говорится, что двойное бронирование не разрешено, поскольку транспортное средство № 1 уже зарезервировано, но оно не учитывает это бронирование.
Есть ли способ собрать оба результата и сообщить об этом приложению?что из-за того, что один из этих двух транспортных средств зарезервирован, ни одно из этих транспортных средств не может быть зарезервировано?
public ActionResult Create([Bind(Include = "ID,StartDate,EndDate,RequestorID,Destination,PurposeOfTrip,TransportStudentsFG,LastChangedBy,LastChangedDate,VehicleList,ThemeColor")] Reservations reservation)
{
if (ModelState.IsValid)
{
var selectedVehicles = reservation.VehicleList.Where(x => x.IsChecked == true).ToList();
List<usp_PreventDoubleBooking_Result> alreadyReservedVehicle = null;
// get each vehicle that was selected to be reserved then check db to make sure it is available
foreach (var selectedVehicle in selectedVehicles)
{
using (VehicleReservationEntities db = new VehicleReservationEntities())
{
alreadyReservedVehicle = db.usp_PreventDoubleBooking(selectedVehicle.ID, reservation.StartDate, reservation.EndDate).ToList();
}
}
if (alreadyReservedVehicle.Count() == 0) // create a new reservation if the vehicle is available at the selected date and time
{
db.Reservations.Add(reservation);
reservation.LastChangedDate = DateTime.Now;
db.SaveChanges();
}
else
{
//return error message on page if vehicle is already reserved
TempData["Error"] = "Double booking of vehicles is not allowed. Please choose another vehicle/time. Check the availability timeline before reserving to ensure there are no errors. Thank you.";
return RedirectToAction("Create");
}
}
}
Это то, что у меня есть до сих пор, и я знаю, что я близок, потому что то, что у меня есть, будет работать при условии, что пользовательтолько пытаюсь зарезервировать одно транспортное средство, которое уже забронировано.Это когда они пытаются создать резервирование для нескольких транспортных средств, когда код учитывает только последнее транспортное средство в списке и использует его в качестве результата, который определяет, будет ли резервирование сохранено.
Я думал о переездеусловное утверждение в foreach, но я не хочу, чтобы резервирование сохранялось для каждого выбранного транспортного средства ... это не имело бы никакого смысла, потому что нужно сохранить только 1 резервирование, оно просто имеет несколько транспортных средств, которыеможет быть связано с этим.
Вот хранимая процедура, которая находит зарезервированные автомобили:
SELECT
v.ID, r.StartDate, r.EndDate
FROM
dbo.Reservations r
JOIN
dbo.ReservationToVehicle rtv ON r.id = rtv.ReservationID
JOIN
dbo.Vehicles v ON v.ID = rtv.VehicleID
WHERE
(v.ID = @VehicleID)
AND (r.StartDate <= @NewEndDate)
AND (r.EndDate >= @NewStartDate)
Итак, как мне получить alreadyReservedVehicle
List
для добавления каждого результата в список, чтобы я мог определить, еслиList
на самом деле имеет Count
0?
ОБНОВЛЕНИЕ:
Вот модель для хранимой процедуры
public partial class usp_PreventDoubleBooking_Result
{
public int ID { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}