Calling all developers! We invite you to provide your input on Feature Experimentation by completing this brief survey.
Calling all developers! We invite you to provide your input on Feature Experimentation by completing this brief survey.
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?