Нужна помощь в упорядочении результата Linq

StackOverflow https://stackoverflow.com/questions/846921

  •  21-08-2019
  •  | 
  •  

Вопрос

У меня есть некоторый Linq-код, который работает нормально.Он извлекает список записей на доске объявлений, упорядоченных по самым последним.

Загвоздка здесь в том, что заказать по ...он упорядочивает по самым последним КОММЕНТАРИЯМ.Таким образом, если сообщение на доске только что получило комментарий, то оно будет в верхней части списка (т.е.самый последний).

кьюл ...но как насчет новых должностей в совете директоров, которые только что были созданы?Они перечислены внизу, потому что у них нет комментариев : ( Как будто я хочу сказать "заказывайте по самым последним комментариям ..но если у вас нет комментария, то это к дате создания вашего поста на доске объявлений)".

вот мой linq...

boardPostList = (from bp in db.tblBoardPosts.Where(whereClause)
    orderby (from bc in bp.tblBoardComments
    orderby bc.DateModified descending
    select bc.DateModified).First() descending
    select bp).ToPagedList(pageNumber, numberOfResults);

У кого-нибудь есть какие-нибудь предложения?

Это было полезно?

Решение

Есть ли какая-либо причина, по которой вы не можете обновить поле в tblBoardPosts всякий раз, когда к нему публикуется комментарий?Сохраните дату "опубликованный или последний комментарий", тогда у вас будет намного более простой запрос, и такой, при котором не нужно сканировать каждый комментарий в системе, чтобы решить, что делать.

Сказав это, этот запрос мог бы работайте, если ваш DateModified поле обнуляется:

boardPostList = (from bp in db.tblBoardPosts.Where(whereClause)
    orderby ((from bc in bp.tblBoardComments
    orderby bc.DateModified descending
    select bc.DateModified).FirstOrDefault() ?? bp.DateModified) descending
    select bp).ToPagedList(pageNumber, numberOfResults);

Если это просто прямая DateTime столбец, результат FirstOrDefault все еще является DateTime который не был бы обнуляемым...Вы могли бы попробовать:

boardPostList = (from bp in db.tblBoardPosts.Where(whereClause)
    let lastComment = bp.tblBoardComments
                        .OrderByDescending(bc => bc.DateModified)
                        .FirstOrDefault()
    let lastModified = (lastComment == null 
                        ? bp.DateModified 
                        : lastComment.DateModified) 
    orderby lastModified descending
    select bp).ToPagedList(pageNumber, numberOfResults);

Однако это довольно отвратительно и может неправильно переводиться в SQL.Я бы, конечно, попытался перейти на схему, при которой post сам отслеживает это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top