#c_sharp #entity_framework #linq #entity_framework_core
Есть табличка с расписанием (день недели + где), в основе лежит enum DayOfWeek: public class Schedule { public int Id { get; set; } public DayOfWeek DayOfWeek { get; set; } public int? PlaceId { get; set; } public Place Place { get; set; } [Required] [MaxLength(50)] public string Notes { get; set; } } И мне для людей приходится делать сортировку по возрастанию дней недели, например: return await this.ApplicationDbContext.Schedule .Where(x => x.PlaceId != null) .OrderBy(x => x.DayOfWeek) .AsNoTracking() .ToListAsync(); И всё было бы прекрасно, но сайт делается для тех стран, где неделя начинается с понедельника (Россия), а не с воскресенья. А DayOfWeek начинается с воскресенья: public enum DayOfWeek { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, } Есть ли какой-то простой способ указать сортировку "первый день недели - понедельник"?
Ответы
Ответ 1
Попробуйте "магию" (на самом деле это просто циклический сдвиг дней внутри недели): .OrderBy(x => ((int)x.DayOfWeek + 6) % 7) В дерево выражений эта лямбда раскладывается нормально, думаю, EF сумеет транслировать это дерево в SQL-запрос (сам не проверял). Метод хорош тем, что простой сменой константы 6 можно сменить и требуемое начало недели. Как спрятать формулу и привести запрос в более читабельный вид можно посмотреть в этом топике: Как составить дерево выражения для лямбды? Дополнение. Действительно, подобный запрос транслируется вполне нормально. Исходный запрос был: SELECT [t0].[Id], [t0].[DayOfWeek], [t0].[Notes], [t0].[PlaceId] FROM [Schedule] AS [t0] WHERE [t0].[PlaceId] IS NOT NULL ORDER BY [t0].[DayOfWeek] Со сдвигом дня недели получается такой: -- Region Parameters DECLARE @p0 Int = 6 DECLARE @p1 Int = 7 -- EndRegion SELECT [t0].[Id], [t0].[DayOfWeek], [t0].[Notes], [t0].[PlaceId] FROM [Schedule] AS [t0] WHERE [t0].[PlaceId] IS NOT NULL ORDER BY ([t0].[DayOfWeek] + @p0) % @p1Ответ 2
Почему не создать собственное перечисление и пользоватся? например, public enum DayOfWeekRussian { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }
Комментариев нет:
Отправить комментарий