0

ユーザーのクラブの一連のフォーラム (fora?) にクエリを実行して、それらのフォーラムで最新のトピックと返信を取得しようとしています。これは私が使用しているコードです:

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

私が抱えている問題は、 への最初の呼び出しをヒットするたびGetQueryResultNullReferenceException. 私が渡そうとしているものに間違っている/欠けているものは何も見えませんがGetQueryResult、他の誰かが以前にこれを行っており、これに対する修正を提案できることを願っています.

更新 26/10/2010
Magnus が提案したように、私は自分QueryHandler.GetQueryResultの電話を への電話に交換しましたForumHandler.GetQueryResultが、これは違いを生んでいないようです。GetQueryResultまた、コード行が次のようになるようにパラメーターを切り詰めました。

MessageCollection topics = ForumHandler.GetQueryResult(topicQuery);

しかし、これでも NullReferenceException が発生します。これは、私が呼び出しているハンドラーの GetQueryResult メソッドに問題があるのではなく、topicQueryオブジェクトにあることを示唆しています。オブジェクトに設定する必要があるプロパティがないかどうか疑問に思っていTopicQueryます。

Update 4/11/2010
ここで考慮が必要な「セキュリティ コンテキスト」はありますか? つまり、すべてのフォーラムに完全にアクセスできるユーザーのコンテキストでクエリを実行する必要がありますか?

4

2 に答える 2

1

EPiServer.Community.Forum.ForumHandler.GetQueryResult()とそのオーバーロードを使用してみてください。

于 2010-10-25T13:33:41.920 に答える
0

これに対する解決策(私の同僚が見つけたもの)は次のとおりです。

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、名前から推測しているものを使用することで、基準のクエリで使用する整数のセットを送信できるようになっているようです(SQLIN句のように)。

于 2010-12-09T14:53:03.537 に答える