Question

J'ai un code Linq, qui fonctionne très bien. Il récupère une liste des postes du conseil commandés par le plus récent.

Le problème ici est le Trier par ... il ordonne par les commentaires les plus récents. Donc, si un poste du conseil d'administration vient de se un commentaire, alors il sera le haut de la liste (ie. Le plus récent).

kewl ... mais qu'en nouveaux messages du conseil qui vient de se créer? Ils sont répertoriés sur le fond, parce qu'il n'a pas de commentaires :( Il est comme je veux dire « pour la plupart des commentaires récents .. mais si u ont pas de commentaire, alors son par votre poste de carte date de création) ».

voici mon 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);

Quelqu'un at-il des suggestions?

Était-ce utile?

La solution

Y at-il une raison quelconque vous ne pouvez pas mettre à jour un champ à chaque fois qu'un commentaire tblBoardPosts est affiché à elle? Gardez le « affiché ou dernier commentaire » ce jour, alors vous avez une beaucoup requête plus simple, et qui n'a pas besoin d'analyser tous les commentaires dans le système pour déterminer ce qu'il faut faire.

Ceci étant dit, cette requête peut travail, si votre champ est annulable 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);

Si c'est juste une colonne droite DateTime, le résultat d'un reste FirstOrDefault qui serait <=> non annulable ... Vous pouvez essayer:

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);

Il est assez hideux cependant, et peut ne pas se traduire par SQL correctement. Je certainement essayer de passer à un système où le poste lui-même en garde la trace.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top