Я хочу отобразить все автомобили, которые доступны в определенный период времени, введенный пользователем - PullRequest
0 голосов
/ 06 апреля 2020

Я сделал представление запроса Модель

 public class QueryVM
{

    public List<CarVM> CarVMs { get; set; }

Это содержит

 public class CarVM
{
    public int CarID { get; set; }
    public int CustomerID { get; set; }

    public string Make { get; set; }

    public string Model { get; set; }

    public string RegNumber { get; set; }
    public string Colour { get; set; }
    public DateTime StartDate { get; set; } //From Booking Table
    public DateTime EndDate { get; set; } //From Booking Table

Это мой контроллер

 public ActionResult Searched(DateTime? Start, DateTime? End)
    {
        if (Start.HasValue)
        {
            ViewBag.Start = Start.Value.Date;
        }
        if (End.HasValue)
        {
            ViewBag.End = End.Value.Date;
        }

        QueryVM queryVM = new QueryVM();
        var carList = db.Cars;
        var bookingList = db.Bookings;

        queryVM.CarVMs = new List<CarVM>();
        foreach (var item in carList)
        {
            CarVM cvm = new CarVM();
            cvm.CarID = item.CarID;
            cvm.Make = item.Make;
            cvm.Model = item.Model;
            cvm.Colour = item.Colour;

            queryVM.CarVMs.Add(cvm);
        }

        foreach (var item in bookingList)
        {
            CarVM bvm = new CarVM();
            bvm.StartDate = item.StartDate;
            bvm.EndDate = item.EndDate;
            queryVM.CarVMs.Add(bvm);
        }
        return View(queryVM);

Сначала я проверяю, есть ли значения данные, а затем я сохраняю их в сумке для просмотра. Затем я заполняю Query ViewModel информацией из db.Cars, а затем заполняю start date и end date из таблицы заказов и возвращаю ViewModel

Это мой код в представлении

 @{
    if (Model != null && ViewBag.Start != null && ViewBag.End != null)
    {
        foreach (var item in Model.CarVMs.Where(r => ViewBag.Start < r.EndDate && ViewBag.End > r.StartDate))
        {
            <td>
                @Html.DisplayFor(modelItem => item.CarID)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Make)
            </td>

Здесь я хочу проверить автомобили, доступные между датами в сумке просмотра, r.EndDate и r.StartDate - текущие даты бронирования из таблицы. Я думаю, что проблема, которую я получаю, заключается в том, что я получаю даты бронирования от db.booking и информацию об автомобиле от db.Cars Но когда я запускаю его, я получаю null или 0, но я получаю даты бронирования

1 Ответ

3 голосов
/ 06 апреля 2020

Это, кажется, испортилось. Предполагается, что CarVM представляет собой автомобиль, и в этом случае можно предположить, что у него также есть список диапазонов дат, когда этот автомобиль уже забронирован (недоступен), но то, что вы делаете, - это наличие одного CarVM, который представляет собой данные автомобиля и затем куча других CarVM, которые просто указывают даты, когда машина забронирована. Сделайте вашу жизнь проще, имейте класс, у которого есть пара дат для начальной и конечной даты - назовем его DateRange, у CarVM есть;

List<DateRange> BookedDates = new List<DateRange>();

Заполните это из вашей базы данных вместо того, чтобы делать несколько новый CarVM с зарегистрированными датами, и тогда у вас будет единая единая модель данных для автомобиля и его бронирований

class DateRange{
  public DateTime StartDate{get;set;}
  public DateTime EndDate{get;set;}

  public bool Overlaps(DateTime qStart, DateTime qEnd){
    //a queried date range is only safe if it starts after this
    //range ends or it ends before this range starts.
    //anything else is an overlap
    return !(qStart > EndDate || qEnd < StartDate);
  }
}

Это означает, что вы можете взять свой список CarVM и выяснить, какие из них доступны с :

carVMs.Where(c => !c.BookedDates.Any(dr => dr.Overlaps(userChosenStartDate, userChosenEndDate)));

"Автомобили, на которых не забронированы даты, перекрывают даты, когда пользователь хочет автомобиль"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...