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

Вот мой код

В этом коде LastLogin - это столбец с типом данных DateTime. Мне нужно отсортировать данные по имени этого столбца.

var res = objUI.Where(x => x.LastLogin != null)
               .GroupBy(x => x.LastLogin.Value.Date)
               .Select(x => new { LastLogin = string.Format("{0:MM/dd/yyyy}", x.Key) })
               .OrderByDescending(x => x.LastLogin)
               .ToList();
3
shami sheikh 2 Янв 2018 в 15:15

2 ответа

Лучший ответ

Не стоит пытаться упорядочить дату как строку;

var res = objUI.Where(x => x.LastLogin != null)
    .GroupBy(x => x.LastLogin.Value.Date)
    .OrderByDescending(x => x.Key)
    .Select(x => new { LastLogin = string.Format("{0:MM/dd/yyyy}", x.Key) })
    .ToList();
9
lucky 2 Янв 2018 в 12:17

Вы заказываете по строковому представлению , которое начинается с месяца.

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

Наконец, если вы форматируете одно значение - определенно значение DateTime - проще просто вызвать метод ToString. В приведенном ниже коде я также явно указал инвариантную культуру - иначе вы можете обнаружить, что используется неожиданная календарная система ...

Я бы написал:

var res = objUI.Where(x => x.LastLogin != null)
               .Select(x => x.LastLogin)
               .Distinct()
               .OrderByDescending(x => x)
               .Select(x => x.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture))
               .ToList();
7
Jon Skeet 2 Янв 2018 в 12:19