Запрос LINQ на основе даты не выполняется с изменением месяца? - PullRequest
0 голосов
/ 06 мая 2019

Итак, мое приложение запрашивает базу данных и получает список событий, попадающих в диапазон, выбранный датчиком начала и конца. Работает нормально, но теперь не получается. Похоже, если в диапазон включены даты с прошлого месяца по этот месяц (скажем, на прошлой неделе), он только извлекает события в мае ... Мои глаза тают, когда я смотрю на это, но, может быть, кто-то может заметить то, что я пропустил?

foreach (Employee ID in activeEmployees)
            {


                var worked = (from workDays in dc.Events

                              where (workDays.Time.Day >= PayPeriodStartPicker.SelectedDate.Value.Day &&
                              workDays.Time.Month >= PayPeriodStartPicker.SelectedDate.Value.Month &&
                              workDays.Time.Year >= PayPeriodStartPicker.SelectedDate.Value.Year)
                              && (workDays.Time.Day <= PayPeriodEndPicker.SelectedDate.Value.Day &&
                              workDays.Time.Month <= PayPeriodEndPicker.SelectedDate.Value.Month &&
                              workDays.Time.Year <= PayPeriodEndPicker.SelectedDate.Value.Year)
                              && workDays.Employee == ID.ID
                              orderby workDays.Time, workDays.ID                                 
                              select workDays).ToList();

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Давайте посмотрим правде в глаза, ваш код беспорядок (сказано с добрыми намерениями).

если вы используете что-то снова и снова, создайте для него псевдоним

var date = PayPeriodStartPicker.SelectedDate.Value;

Кроме того, сравнение дат по дням , месяцу и году по отдельности не является правильным способом сделать это

Если я понимаю, что вы хотите, то, вероятно, все ваше выражение может быть разбито следующим образом

workDays.Time >= date &&
workDays.Time <= date &&
workDays.Employee == ID.ID

Если вам нужно игнорировать время , я предлагаю использовать EntityFunctions.TruncateTime и DateTime.Date методы;

1 голос
/ 06 мая 2019

Логика этого запроса просто не работает. Скажем, вы хотите все между 30-04-2019 и 01-05-2019: все записи с 2019 годом, месяцами 4 или 5 и днем ​​больше или равным 30 и меньше или равным 1 будут совпадать , То есть оно никогда ничего не вернет.

Я не совсем уверен, почему вы получаете вывод, который видите, но в любом случае что-то не так.

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

...