Frage

Ich habe einige Linq-Code, das funktioniert gut. Es ruft eine Liste der Board Beiträge der jüngsten geordnet.

Der Haken dabei ist, die um durch ... es Aufträge durch die jüngsten Kommentare. Also, wenn ein Forum erstellt einfach einen Kommentar bekommt, dann wird es oben in der Liste nach oben (dh. Jüngst).

kewl ... aber was ist mit neuen Board-Posts, die wurde gerade erstellt? Sie sind auf die unten aufgeführten, weil sie keine Kommentare :( Es ist wie ich „sagen will, , um durch die neuesten Kommentare an .. aber wenn u keinen Kommentar hat, dann wird sie von den Board Post erstellen Datum) “.

hier ist mein 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);

Hat jemand irgendwelche Vorschläge haben?

War es hilfreich?

Lösung

Gibt es einen Grund, warum Sie kein Feld in tblBoardPosts aktualisieren können, wenn ein Kommentar zu ihm geschrieben ist? Halten Sie die „gepostet oder letzter Kommentar“ date, dann haben Sie, eine viel einfachere Abfrage, und eine, die nicht braucht jeden Kommentar im System zu scannen, um herauszufinden, was zu tun ist.

Having said that, diese Abfrage Macht Arbeit, wenn Ihre DateModified Feld NULL-Werte zugelassen:

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

Wenn es nur eine gerade DateTime Spalte, ist das Ergebnis der FirstOrDefault noch ein DateTime, die nicht-nullable sein würde ... Sie könnten versuchen:

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

Es ist ziemlich obwohl scheußlich, und kann in SQL nicht richtig übersetzen. Ich würde auf jeden Fall versuchen, ein System zu ändern, in dem die Post selbst Schiene von ihm hält.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top