2016-04-13 2 views
1

Я экономя поле времени в моей базе данных сервера sql как nvarchar в формате (HH: mm). C# List Сортировать по Время в обратном хронологическом порядке

По предложению КАЖДЫЙ. Теперь я сохранил время в базе данных sql-сервера в формате DateTime. Хотя мне не нужна часть даты, я буду использовать это свойство, чтобы добиться эффекта, который я пытаюсь сделать. Теперь я хочу получить список строк в обратном хронологическом порядке в зависимости от текущего времени выполнения. Например, если моя таблица выглядит следующим образом:

tblFavoriteTime 
ID  Time  Post 
1  05:00 AM Something.. 
2  09:00 AM Another.. 
3  12:00 PM Hello.. 
4  01:00 PM Its 8 am.. 

Когда я захожу на сайт в 12:00, мне нужен список времени в обратном хронологическом порядке. Так 12:00 МП будет находиться в верхней части списка, 12:00PM -> 11:00AM -> 10:00AM -> .... 1:00AM -> 12:00AM -> 01:00PM -> 02:00PM -> ..... 11:00PM Используя данные выше, я должен получить:

ID  Time   Post 
3  12:00 PM  Hello... 
2  09:00 AM  Another.. 
1  05:00 AM  Something.. 
4  01:00 PM  Its 1 pm.. 

Есть ли способ сделать это с помощью LinQ .OrderBy() или что-то вроде этого:

var mylist = _repository.GetAll().ToList() 
      .OrderBy(x => x.TimeStamp.TimeOfDay() .......); 
      //as I explained, Im only getting the time of day though its a datetime object, date part wont matter.. 

Пожалуйста, помогите!

+0

, как это 13:00 наконец после сортировки? –

+6

Почему вы храните [время] (https://msdn.microsoft.com/en-gb/library/bb677243.aspx) как nvarchar? –

+0

@EhsanSajjad позволяет говорить, что у вас есть часы, когда вы смотрите на него в 12:00, представьте, что часы идут против часовой стрелки, '12AM -> 11AM -> ... -> 1AM -> 12PM - 1 PM' –

ответ

3

Это делает то, что вы хотите?

var times = new [] { "10:30", "22:40", "12:00", "10:00", "13:00", "08:00", }; 

var output = times.OrderByDescending(x => (x.CompareTo("10:00") <= 0 ? "Z" : "") + x); 

я получаю следующее:

 
10:00 
08:00 
22:40 
13:00 
12:00 
10:30 

Попробуйте это для DateTime полей.

var times = 
    new [] { "10:30", "22:40", "12:00", "10:00", "13:00", "08:00", } 
     .Select(x => DateTime.Parse(x)); 

var output = times.OrderByDescending(x => (x.TimeOfDay.TotalHours <= 10 ? 24.0 : 0.0) + x.TimeOfDay.TotalHours); 

Я получаю тот же результат, что и выше.

+0

Да, я пытаюсь сделать такой вывод. Но что я должен ссылаться на использование CompareTo(), im получая красные squiggly строки при вызове, а мой vs2013 не может автоматически разрешить его. –

+0

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

+0

См. Мое редактирование .. –

0

Если вы "застряли" с nvarchar, вы можете сначала разобрать на TimeSpan, например.

var times = new [] { "10:30", "22:40", "12:00", "10:00", "13:00", "08:00", }; 
var output = times.OrderByDescending(x => TimeSpan.Parse(x)); 
+0

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

0
TimeSpan now = DateTime.Now.TimeOfDay; //site visit time 

var query = rows.ToList() 
    .OrderBy(x => x.TimeStamp.TimeOfDay <= now ? 1 : 2) 
    .ThenByDescending(x => x.TimeStamp.TimeOfDay); 
+0

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

Смежные вопросы