Нужна помощь при заказе результата Linq - PullRequest
0 голосов
/ 11 мая 2009

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

Подвох здесь - это заказ на ... он заказывает по самым последним комментариям. Так что, если сообщение на форуме только что получило комментарий, оно будет в верхней части списка (т. Е. Самое последнее).

kewl ... а как насчет новых сообщений на форуме, которые только что были созданы? Они перечислены внизу, потому что у них НЕТ комментариев :( Это похоже на то, что я хочу сказать " упорядочить по последним комментариям ... но если у вас нет комментариев, то это будет ваша дата создания сообщения на вашей доске) ».

вот мой 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);

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

1 Ответ

0 голосов
/ 11 мая 2009

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

Сказав это, этот запрос может работать, если ваше поле DateModified имеет значение NULL:

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. Я, конечно, попытался бы перейти на схему, где само сообщение отслеживает это.

...