Отрегулируйте. NET Список результатов Linq, чтобы он показывал AS C будущее, а затем DES C прошлый список, который можно пропустить для одной страницы - PullRequest
0 голосов
/ 05 мая 2020

Я прочитал много связанных вопросов, но не могу найти его точно.

Я пытаюсь настроить порядок на СТАРОЙ веб-странице. NET (4.0), чтобы отображались события, которые являются предстоящими AS C (сначала отображаются ближайшие в будущем), за которыми следуют события в прошлом, показывающие их DES C в едином списке, который пропускается, чтобы перейти на «страницу» результатов.

Вот так:

  • Событие 1 - завтра
  • Событие 2 - через неделю
  • Событие 3 - через месяц
  • Событие 4 - вчера
  • Событие 5 - неделя a go
  • Событие 6 - месяц a go

Выполняется захват текущей функции список и выполняет сортировку, пропуск и берет (одну страницу):

// Currently this creates a single list order by date desc
var numToLoad = 20;
var list = _context.AllItems.Where(i => i.typeTitle == source);
var items = list.OrderByDescending(i => i.dateCreated).Skip((pageNum - 1) * numToLoad).Take(numToLoad);

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

// We need a single list but with upcoming dates first, ascending, then past dates descending
var dateNow = DateTime.Now;
var listFuture = _context.AllItems.Where(i => i.typeTitle == source && i.dateCreated >= dateNow).OrderBy(i => i.dateCreated);
var listPast = _context.AllItems.Where(i => i.typeTitle == source && i.dateCreated < dateNow).OrderByDescending(i => i.dateCreated);
var listAll = listFuture.Concat(listPast);
var itemsAll = listAll.Skip((pageNum - 1) * numToLoad).Take(numToLoad); // <-- this gives an error as it's not sorted

Так что мне не нужно переписывать весь код, который обрабатывает возвращенный список (разбивка на страницы и c). Я бы очень хотел иметь возможность вернуть один список из функции!

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

Есть идеи?

1 Ответ

0 голосов
/ 05 мая 2020

Проблема здесь в том, что .Concat () двух запросов теряет порядок при преобразовании в SQL (вы не можете объединить два запроса с разным порядком каждый).

Если вы используете MS SQL , вы можете использовать такой порядок:

var dateNow = DateTime.Now;
var query = _context.AllItems
  .Where(i => i.typeTitle == source)
  // future items first
  .OrderBy(i => i.dateCreated >= dateNow ? 0 : 1)
  // items which closer to now first
  .ThenBy(i => Math.Abs(System.Data.Entity.SqlServer.SqlFunctions.DateDiff("day", dateNow, i.dateCreated).Value));

var list = query.Skip((page - 1) * pageSize).Take(pageSize).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...