#entity-framework #linq #sql-order-by #where-clause
#структура объектов #linq #sql-порядок по #где-предложение
Вопрос:
Я уже некоторое время использую Entity Framework без каких-либо проблем, пока не наткнулся на фигурный….ну, по крайней мере, для меня. Я искал в Интернете и не могу найти ничего, связанного с этим, но я предполагаю, что это просто потому, что я задаю неправильный вопрос. Итак, вот так…
query= query.OrderByDescending(u => u.DateCreated);
Это просто и работает нормально. Однако запрашиваемая таблица предназначена для рабочего процесса и содержит 4 столбца даты, CreatedDate
, EstimatedDate
, RevisedDate
и ActualDate
. В начале рабочего процесса для этого элемента CreatedDate
будут указаны столбцы will и все остальные столбцы date NULL
. По мере прохождения элемента через рабочий процесс будут заполняться последующие даты.
Итак, чего я пытаюсь добиться, так это того, что я не хочу никакой группировки, я просто хочу, чтобы дата, которая будет использоваться OrderBy()
, была последней датой в рабочем процессе.
Я могу добиться этого, добавив в свою вызываемую FilterDate
таблицу еще один столбец, который используется исключительно для сортировки и обновляется с соответствующей датой на основе рабочего процесса, однако это добавляет еще один столбец в мою таблицу только потому, что я не могу придумать разумный метод достижения этого.
Комментарии:
1. Можете ли вы пояснить, что вы подразумеваете под «последней датой в рабочем процессе» в этом предложении «я не хочу никакой группировки, я просто хочу, чтобы дата, которая будет использоваться для OrderBy(), была последней датой в рабочем процессе»?
2. Прошу прощения, если я неправильно объяснил себя, но, надеюсь, это имеет больше смысла. Рабочий процесс, о котором я говорю, предназначен для рабочего задания для завершения задания. При первом создании рабочего задания все поля даты будут иметь значение NULL, за исключением CreatedDate . Поэтому, когда есть список всех рабочих заданий, я хочу, чтобы этот конкретный рабочий заказ был упорядочен в списке на основе его CreatedDate. Как только подрядчик примет задание, он предложит дату, это будет оценочная дата.
3. На этом этапе я хочу, чтобы этот конкретный рабочий заказ был упорядочен в списке на основе его EstimatedDate, а не его CreatedDate . Опять же, на более позднем этапе подрядчик может предложить новую дату, следовательно, пересмотренную дату, а затем, наконец, после завершения работы, я хочу, чтобы заказ на выполнение работ был упорядочен в списке заказов на выполнение работ на основе его фактической даты.
4. Как я уже сказал, я могу создать дополнительный столбец даты для WorkOrder, где я просто помещаю самую последнюю дату в рабочем потоке в этот столбец, чтобы я мог просто фильтровать по этому столбцу даты и всегда возвращать рабочие задания на основе их самой последней даты в рабочем процессе. Но это дополнительный столбец в таблице исключительно для целей фильтрации.
Ответ №1:
Это некрасиво, но это должно быть то, что вы ищете, предполагая, что ActualDate (если заполнено) всегда>= RevisedDate >= EstimatedDate => CreatedDate:
query= query.OrderByDescending(u => u.ActualDate.HasValue
? u.ActualDate.Value
: u.RevisedDate.HasValue
? u.RevisedDate.Value
: u.EstimatedDate.HasValue
? u.EstimatedDate.Value
: u.CreatedDate);
Это будет упорядочено по любой доступной дате, отдавая предпочтение Фактической, а не Пересмотренной, а не Расчетной, и по умолчанию — Созданной.
Это не относится к тому, возможно ли, что RevisedDate может быть, например, после ActualDate . Если бы строка имела дату пересмотра 2020-12-02 и фактическую дату 2020-11-25, этот запрос использовал бы фактическую дату для сравнения, а не более позднюю дату пересмотра.
Комментарии:
1. Даты в рабочем потоке всегда указаны в том порядке, в каком вы предполагали. Я скоро протестирую этот метод и посмотрю, как он работает. Я не знаком с ? в запросе so нужно будет узнать больше об этом. Спасибо
Ответ №2:
Если я правильно понял ваш вопрос, то вам не нужно добавлять дополнительный столбец в вашу таблицу.
Вам просто нужно добавить [NotMapped]
оформленное свойство к вашему объекту, потому что это свойство не будет сохранено в базе данных.
[NotMapped]
public DateTime FilteringDate
{
get
{
if (ActualDate.HasValue) return (DateTime)ActualDate;
else if (RevisedDate.HasValue) return (DateTime)RevisedDate;
else if (EstimatedDate.HasValue) return (DateTime)EstimatedDate;
else return CreatedDate;
}
}
использование
query = query.OrderByDescending(u => u.FilteringDate);