NullReferenceException при получении последних тем и ответов для форумов в клубах пользователя - PullRequest
0 голосов
/ 25 октября 2010

Я пытаюсь запросить набор форумов (форумов) для клубов пользователя, чтобы получать последние темы и ответы на этих форумах. Это код, который я использую:

RoomCollectionCriterion userClubRoomsCollection = new RoomCollectionCriterion();

foreach (Club userClub in userClubCollection)
{
    RoomCriterion userClubRoomCriterion = new RoomCriterion();
    userClubRoomCriterion.ID = new IntegerCriterion();
    userClubRoomCriterion.ID.Value = userClub.ForumRoom.ID;

    userClubRoomsCollection.Criteria.Add(userClub.Name, userClubRoomCriterion);
}

TopicQuery topicQuery = new TopicQuery();

topicQuery.Room = new RoomCriterion();
// Pass in our collection of the user's clubs to the query
topicQuery.Room.Rooms = userClubRoomsCollection;

MessageCollection topics = QueryHandler.GetQueryResult<EPiServer.Community.Forum.Topic, MessageCollection>(topicQuery, pageNumber, 2);
MessageCollection replies = QueryHandler.GetQueryResult<EPiServer.Community.Forum.Topic, MessageCollection>(topicQuery, pageNumber, 4);

У меня проблема в том, что каждый раз, когда я нажимаю на первый вызов GetQueryResult, я получаю NullReferenceException. Я не вижу ничего плохого или отсутствующего в том, что я передаю в GetQueryResult, но я надеюсь, что кто-то еще сделал это ранее и может предложить исправить это.

Обновление от 26.10.2010
Как подсказал Магнус, я поменял свой QueryHandler.GetQueryResult на звонок ForumHandler.GetQueryResult, но, похоже, это ничего не изменило. Я также обрезал параметры до GetQueryResult, так что теперь моя строка кода:

MessageCollection topics = ForumHandler.GetQueryResult(topicQuery);

но это все равно дает мне исключение NullReferenceException. Это наводит меня на мысль, что проблема не в методе GetQueryResult того обработчика, который я вызываю, а в объекте topicQuery, так как он до сих пор оставался неизменным. Мне интересно, если мне не хватает свойства, которое нужно установить для объекта TopicQuery.

Обновление 4/11/2010
Есть ли здесь «контекст безопасности», который требует рассмотрения? то есть запрос должен выполняться в контексте пользователя, который имеет полный доступ ко всем форумам?

Ответы [ 2 ]

1 голос
/ 25 октября 2010

Попробуйте использовать EPiServer.Community.Forum.ForumHandler.GetQueryResult() и его перегрузки.

0 голосов
/ 09 декабря 2010

Решение этого (как нашел мой коллега):

TopicQuery topicQuery = new TopicQuery();

//For latest topics we want to sort by the topics creation date.
topicQuery.CreateDate = new DateTimeCriterion();
topicQuery.Room = new RoomCriterion();
topicQuery.Room.ID = new IntegerCriterion();
//We want to include several roomIDs
topicQuery.Room.ID.Includes = new IntegerInCriterion();

//For each club, get its ForumRoom
foreach (Club userClub in userClubCollection)
{
    topicQuery.Room.ID.Includes.Values.Add(userClub.ForumRoom.ID);
}

//Sorting of results
CriterionSortOrder critSort = new CriterionSortOrder(topicQuery.CreateDate, EPiServer.Common.Sorting.SortingDirection.Descending);

//Add sorting to query
topicQuery.OrderBy.Add(critSort);

MessageCollection topics = QueryHandler.GetQueryResult<EPiServer.Community.Forum.Topic, MessageCollection>(topicQuery, 1, 2);
topicQuery.OrderBy.Remove(critSort);

//For Latest replies we want to sort topics by LastReply.CreateDate. Therefore we add this. 
topicQuery.LastReply = new ReplyCriterion();
topicQuery.Replies = new ReplyCollectionCriterion();
topicQuery.Replies.Count = new IntegerCriterion();
topicQuery.Replies.Count.Operator = ComparisonOperator.GreaterThan | ComparisonOperator.Equals;
topicQuery.Replies.Count.Value = 1;
topicQuery.LastReply.CreateDate = new DateTimeCriterion();
CriterionSortOrder critSort2 = new CriterionSortOrder(topicQuery.LastReply.CreateDate, EPiServer.Common.Sorting.SortingDirection.Descending);

topicQuery.OrderBy.Add(critSort2);
MessageCollection replies = QueryHandler.GetQueryResult<EPiServer.Community.Forum.Topic, MessageCollection>(topicQuery, 1, 4);

lvMyEntries.DataSource = topics;
lvMyEntries.DataBind();
lvMyReplies.DataSource = replies;
lvMyReplies.DataBind();

Ключевым моментом здесь является использование IntegerInCriterion, которое, как я понимаю из названия, позволяет вам отправитьнабор целых чисел, которые будут использоваться в запросе в качестве критерия (как я полагаю, в предложении SQL IN).

...