TheSniper105 Ответов: 1

Времени искать в LINQ в C#


у меня есть история изменения зарплаты сотрудника

и нужно найти какова зарплата за искомый период например

заработная плата была изменена в следующие даты

08/03/2017 он был 2200 US и стал 2300
24/12/2018 он был 2300 США и стал 2400
25/12/2018 он был 2400 США и стал 2300
17/02/2019 он был 2300 США и стал 2400


если бы я искал зарплату в период с 26/01/2017 в 25/02/2017 я ожидаю, что результат будет 2200

если бы я искал зарплату в период с 26/02/2017 в 25/03/2017 я ожидаю, что результат будет 2300

если бы я искал зарплату в период с 26/11/2018 - 25/12/2017 я ожидаю, что результат будет 2400

если бы я искал зарплату в период с 26/12/2018 - 25/01/2019 я ожидаю, что результат будет 2300



проблема с моим кодом c# в том, что он возвращает все даты с 08/03/2017 по 17/02/2019

в любой период из искомых периодов выше

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



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

var dbitem = db.tblSalaryHistories.Where(c => c.Employee_ID == employeeId && (
                         (startDate <= c.Update_Date && endDate >= c.Update_Date) ||
                         (startDate >= c.Update_Date && endDate <= c.Update_Date) ||
                         (startDate <= c.Update_Date) ))

1 Ответов

Рейтинг:
0

OriginalGriff

Проблема в том, что ваш код делает именно то, что вы от него требуете: возвращает все данные.
Это происходит потому, что у вас есть или условия, которые составляют:

(a <= b && c >= b) || (a >= b && c <= b) || (a <= b)

Итак, если в любое время, а < b, все условие истинно. Первое условие не имеет значения, потому что третье всегда будет истинным, когда истинно первое.

Поэтому, если вы ищете начальную дату 26-01-2017, if автоматически сопоставит все строки в вашем образце данных и вернет их.

Если вы предоставляете порядок - возможно, c.UpdateDate по возрастанию, вы можете использовать FirstOrDefault вместо того, чтобы возвращать одну строку, но даже тогда, я думаю, вы хотите более внимательно посмотреть на свое состояние и, вероятно, уменьшить его до
startDate <= c.Update_Date && endDate >= c.Update_Date


TheSniper105

параметр StartDate &ЛТ;= ц.Update_Date &амп;&амп; конечная дата &ГТ;= ц.Update_Date
будет падать, если поисковый пероид находится с 26/01/2017 по 25/02/2017 ничего не вернет, так как первая модификация-08/03/2017
я ожидаю, что он вернет oldSalary до модификации в 08/03/2017, которая составляет 2200