2015-01-29 5 views
1

У меня есть система бронирования и страница с указанием заказов пользователя - прошлого и будущего.Упорядочить по дате в разных направлениях

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

настоящее время у меня это:

from sess in Sessions 
    orderby sess.SessionDate < DateTime.Now.Date, sess.SessionDate 
    select sess 

Но что дает оба набора в порядке Asc. Любой способ условно сортировать после предложения первого порядка?

Я также рассмотрел использование IQueryable<T>.Concat. Это будет путь? Я предполагаю, что результаты в каком-то Союзе, но могу ли я гарантировать, что он сохранит порядок сортировки для обоих наборов?

например. Результаты: Sessions

2015-03-01 - some class 
2015-03-15 - a different class 
2015-04-10 - also a class 
(the split between past and future sessions) 
2014-12-22 - some tutorial 
2014-11-15 - some sort of class 
2014-10-08 - some other class 

ответ

3

Вы можете использовать тройной оператор в сочетании с функцией DateDiff для второго порядка. Это позволит вам поменять DateTime.Now и ваш SessionDate

let isSessionDateLessThanNow = sess.SessionDate < DateTime.Now 
orderby isSessionDateLessThanNow, 
     isSessionDateLessThanNow ? 
      SqlFunctions.DateDiff("s", sess.SessionDate, DateTime.Now) : 
      SqlFunctions.DateDiff("s", DateTime.Now, sess.SessionDate) 
+0

Ницца. Это отличный фрагмент кода. –

+0

Можете ли вы подробнее рассказать о своем ответе. Я смотрю на него и до сих пор не знаю, «что только что произошло». Я просто знаю, что это выглядит потрясающе. – granadaCoder

+1

@granadaCoder - первый «порядок от» будет оцениваться как «false» для будущих дат, поэтому они будут размещены до прошлых дат. Второй 'order by' просто упорядочивает ближайший к' DateTime.Now', но вам нужно поменять параметры на _border_, иначе вы начнете получать отрицательные числа – Aducci

0

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

Я не вижу никаких шансов решить этот вопрос без всякого беспорядка.