Have you tried using ForumHandler.GetTopics? This is what I use and it seems to produce the result I expect:
ForumHandler.Instance.GetTopics(rooms, EntityStatus.Approved, page, pageSize, out itemCount, new TopicSortOrder(TopicSortField.LastReply, SortingDirection.Descending));
(rooms is a RoomCollection but it can of course contain only one room)
Yes, i have tried GetTopics but it behaved a bit wierd where a few Topics ended up at the end of the list eventhough hey where newer then some of the others.
GetTopics also puts the prioritized Topics at the top, something that i dont want in all cases so a custom query seemed to be the way to go.
I had the same problem and after tearing my hair for hours I created a new class called CommentObject.
************************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace Extra.classes
{
public class CommentObject
{
private string _title;
private string _author;
private string _authorUrl;
private DateTime _commentDate;
private string _commentUrl;
private string _typeOfComment;
private int _nrOfComments;
public string Title
{
get {return _title;}
set{_title = value;}
}
public string Author
{
get { return _author; }
set { _author = value; }
}
public string AuthorUrl
{
get { return _authorUrl; }
set { _authorUrl = value; }
}
public string CommentUrl
{
get { return _commentUrl; }
set { _commentUrl = value; }
}
public DateTime CommentDate
{
get { return _commentDate; }
set { _commentDate = value; }
}
public string TypeOfComment
{
get { return _typeOfComment; }
set { _typeOfComment = value; }
}
public int NrOfComments
{
get { return _nrOfComments; }
set { _nrOfComments = value; }
}
}
// Custom comparer for the Product class
class CommentObjectComparer : IEqualityComparer<CommentObject>
{
// Products are equal if their names and product numbers are equal.
public bool Equals(CommentObject x, CommentObject y)
{
//Check whether the compared objects reference the same data.
if (Object.ReferenceEquals(x, y)) return true;
//Check whether any of the compared objects is null.
if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
return false;
//Check whether the products' properties are equal.
return x.Title == y.Title && x.CommentDate == y.CommentDate;
}
// If Equals() returns true for a pair of objects
// then GetHashCode() must return the same value for these objects.
public int GetHashCode(CommentObject comment)
{
//Check whether the object is null
if (Object.ReferenceEquals(comment, null)) return 0;
//Get hash code for the Title field if it is not null.
int hashCommentTitle = comment.Title == null ? 0 : comment.Title.GetHashCode();
//Get hash code for the CommentDate field.
int hashCommentDate = comment.CommentDate.GetHashCode();
//Calculate the hash code for the CommentObject.
return hashCommentTitle ^ hashCommentDate;
}
}
}
*****************************************************************
I then made 2 queries. One to get the latest replies (ReplyQuery) and one for the latest topics (TopicQuery) and for each collection I did;
IList<CommentObject> commentholder = new List<CommentObject>();
foreach (Reply reply in replies)
{
CommentObject commentObject = new CommentObject();
commentObject.Title = reply.Subject;
commentObject.Author = reply.Author.Name;
commentObject.AuthorUrl = ((UserAuthor)reply.Author).User.GetMyPageUri().ToString();
commentObject.CommentDate = reply.CreateDate;
commentObject.CommentUrl = reply.Topic.GetTopicUri().ToString();
commentholder.Add(commentObject);
}
foreach Topic t in topics) {
...same as above..
}
IList<CommentObject> sortedList = commentholder.OrderByDescending(o => o.CommentDate).ToList<CommentObject>();
Then I Databound the sortedList.
and rendered it in a ListView like;
<asp:HyperLink ID="hlEntryTitle" runat="server" Text="<%#((Extra.classes.CommentObject)Container.DataItem).Title %>" NavigateUrl="<%#((Extra.classes.CommentObject)Container.DataItem).CommentUrl %>" CssClass="large"/>
Surely there must be an easier way but I could not find it. If you figure something out, please let me know! :-D
/Jens
What i need to do is create a query that will get the last 5 updates in a forum room regardless if it is a new post or a reply to an old post.
To order on new replies i would add something like this:
And to order on new topics i would add something like this:
This dosent do what i want though :(
What i want is for it to order by LastReply.Created where there is a reply and on Created if the Topic dosent have any replies.
How would i go about ordering my results in that way?