Как вы перебираете класс начального и конечного DateTimes, сохраняя дни между каждым диапазоном дат в списке, с каждой итерацией? - PullRequest
1 голос
/ 25 апреля 2019

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

Не уверен, что моя логика правильна, но я думаю, есть ли List<DateTime> всех дат с сегодняшнего дня до последнего дня 2019 года.

Затем я перебираю класс диапазонов дат, заполненных забронированными датами в базе данных, и заполняю новые List этими; затем создайте третий список, например availableDates = allDays.Except(bookedDates).

Проблема в том, что один список List<DateTime>, а другой - List<DateRange>, который имеет 2 DateTime Properties.

Как перебрать класс dateRange, а затем для каждого диапазона дат сохранить все дни между датой прибытия и отъезда?

Сервисный метод для получения забронированных дат из базы данных

  public List<DateRange> GetBookedDates(int id)
    {
        DateRange dateRange = new DateRange();

        DateTime start = Convert.ToDateTime(dateRange.Arrive);

        DateTime endDate = Convert.ToDateTime(dateRange.Depart);

        SqlConnection conn = new SqlConnection(dataSource);

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

        //To avoid sql injections parameters are used so the sql query is not concatinated with user input.  
        string sqlQueryDeleteBooking = "SELECT Arrive, Depart FROM dbo.Bookings WHERE Cottage_ID=@id";

        SqlCommand cmd = new SqlCommand(sqlQueryDeleteBooking, conn);
        cmd.Parameters.AddWithValue("@id", id);

        conn.Open();

        SqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            if (!reader.HasRows)
            {
                throw new Exception();
            }
            else
            {
                bookedDates.Add(new DateRange()
                {


                    Arrive = Convert.ToDateTime(reader["Arrive"]),
                    Depart = Convert.ToDateTime(reader["Depart"]),

                });

                for (DateTime dates = start; dates <= endDate; dates = dates.AddDays(1))
                {

                    bookedDates.Add(dates);

                }
            }


        }reader.NextResult();

        return bookedDates;
    }

Цикл работал для получения списка дней с сегодняшнего дня до 31 декабря, но, очевидно, bookedDates - это List<DateRange> не List<DateTime> Могу ли я привести dates как тип DateRange или наоборот?

Сервисный метод для получения всех дней в году

     public List<DateTime> GetAvailableDates(int id)
    {
        DateTime start = DateTime.Today;
        string end = "31/12/2019";
        DateTime endDate = DateTime.Parse(end);

        List<DateTime> allDays = new List<DateTime>();

        for (DateTime dates = start; dates <= endDate; dates = dates.AddDays(1))
        {

            allDays.Add(dates);

        }

        return allDays;
    }

Класс диапазона дат

[DataContract]
public class DateRange
{
   [DataMember]
   public DateTime Arrive { get; set; }
   [DataMember]
   public DateTime Depart { get; set; }

}

}

Так что да, идея состоит в том, чтобы убрать все забронированные дни в DateRange из списка allDays.

У меня есть List<DateTime> allDays и List<DateRange> bookedDate как их использовать вместе?

ТИА!

1 Ответ

0 голосов
/ 25 апреля 2019

Я бы предпочел вернуть доступные даты в виде отложенного перечисления:

public static IEnumerable<DateTime> GetAvailableDates(int id)
{
    DateTime startDate = DateTime.Today;
    DateTime endDate = new DateTime(2019, 12, 31);
    var bookedDates = GetBookedDates(id);
    for (DateTime date = startDate; date <= endDate; date = date.AddDays(1))
    {
        if (bookedDates.Any(range => date >= range.Arrive && date <= range.Depart)) continue;
        yield return date;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...