Нужна помощь в упорядочении результата Linq
-
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 сам отслеживает это.