none
如何获取Team Discussion中 每个Topic 的最后回复人? RRS feed

  • 问题

  • 如图:下面只显示了创建者,最后回复的时间, 但是我想通过代码获取 最后回复的人! 这样这个看Topic的时候就可以直接知道 谁最后回复了这篇帖子! 目前我用下面代码已实现 , 但是我认为非常的不好 ! 循环太多了,如果项太多,循环会越来越大!

    但是又想不到其他好的办法... 所以请大家帮忙看看! 谢谢!

     

    protected void Page_Load(object sender, EventArgs e)
     {
      GetDisBoard();
     }
    
     public void GetDisBoard()
     {
      using (SPSite site = new SPSite("http://moss:5000"))
      using (SPWeb web = site.RootWeb)
      {
       SPList list = web.Lists["Team Discussion"];
       //获取帖子
       foreach (SPListItem spListItem in list.Folders)
       {
        Response.Write(GetLastPost(spListItem.ID));
        Response.Write("<p></p>");
        
       }
    
      }
     }
    
     public string GetLastPost(int topicID)
     {
      List<string> replies = new List<string>();
      using (SPSite site = new SPSite("http://moss:5000"))
      using (SPWeb web = site.RootWeb)
      {
    
       SPList list = web.Lists["Team Discussion"];
       foreach (SPListItem item in list.Items)
       {
        //获取帖子的回复
        if (item["ParentFolderId"] + "" == topicID + "")
        {
         replies.Add("Last reply by " + item.Fields["Created By"].GetFieldValueAsText(item["Created By"]) +
            " on " + item["Modified"]);
        }
       }
      }
      string lastReply = "No one reply";
      if (replies.Count > 0)
      {
       lastReply = replies[replies.Count - 1];
      }
      return lastReply;
     }
    问题也提在另一个帖子里面 : http://social.microsoft.com/Forums/zh-CN/partnercndevsharepoint/thread/fc8b39d2-fd5d-49b7-877c-ae67d87e2f6b/



    Anything Is Possible !
    2010年11月23日 5:29

答案

  • 你可以使用SPQuery对象,这个对象有一个Folder属性,会限制查询的范围 当你找某一个主题最新帖子的时候(主题本质上是一个文件夹) 你就可以把这个文件夹作为参数设置到SPQuery上面 然后: query.Query = "<OrderBy><FieldRef Name='Created' Ascending='FALSE' /></OrderBy>"; // 按创建时间逆序排序 query.RowLimit = 1; // 只取最新的一个 然后再list.GetItems(query) 就可以了,如果有回复的话就会取到最新一个回复的item,后面的你应该就会了
    • 已标记为答案 Jiang Hao 2010年11月29日 5:26
    2010年11月29日 4:59

全部回复

  • up ...
    Anything Is Possible !
    2010年11月24日 3:42
  • 你可以使用SPQuery对象,这个对象有一个Folder属性,会限制查询的范围 当你找某一个主题最新帖子的时候(主题本质上是一个文件夹) 你就可以把这个文件夹作为参数设置到SPQuery上面 然后: query.Query = "<OrderBy><FieldRef Name='Created' Ascending='FALSE' /></OrderBy>"; // 按创建时间逆序排序 query.RowLimit = 1; // 只取最新的一个 然后再list.GetItems(query) 就可以了,如果有回复的话就会取到最新一个回复的item,后面的你应该就会了
    • 已标记为答案 Jiang Hao 2010年11月29日 5:26
    2010年11月29日 4:59
  • 非常感谢你给我提供的帮助,用下面代码我已测试通过 using (SPSite site = new SPSite("http://moss:5000")) using (SPWeb web = site.RootWeb) { SPList list = web.Lists["Team Discussion"]; //获取帖子 SPQuery query; foreach (SPListItem spListItem in list.Folders) { query = new SPQuery(); query.Query = "<OrderBy><FieldRef Name='Created' Ascending='FALSE' /></OrderBy>"; query.RowLimit = 1; query.Folder = spListItem.Folder; SPListItemCollection replies = list.GetItems(query); Response.Write(replies.Count == 0 ? "No reply
    " : replies[0].Fields["Created By"].GetFieldValueAsText(replies[0]["Created By"]) + "
    "); } }
    Anything Is Possible !
    2010年11月29日 5:26
  • hi, Erucy,你好!

    用 SPSiteDataQuery对象怎么不行呢?

    public
     void
     GetQuery(string
     DiscussionLastUpdated)
    {
    using (SPSite site = new SPSite("http://moss:5000" ))
    using (SPWeb web = site.RootWeb)
    {
    SPSiteDataQuery query = new SPSiteDataQuery();
    query.Webs = "<Webs Scope=\"SiteCollection\">" ;
    // 108 表示Discussion http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.spsitedataquery.lists.aspx
    query.Lists = "<Lists ServerTemplate=\"108\" />" ;
    //query.ViewFields =
    // "<FieldRef Name=\"Title\" /><FieldRef Name=\"Created\" /><FieldRef Name=\"DiscussionLastUpdated\" />";
    query.ViewFields = "<FieldRef Name=\"Author\" />" ;

    DiscussionLastUpdated = SPUtility.FormatDate(web, Convert.ToDateTime(DiscussionLastUpdated).AddHours(-8), SPDateFormat.ISO8601);
    //DiscussionLastUpdated 为最后回复的时间, 即最后回复的创建时间
    query.Query =
    @"<Where><Eq><FieldRef Name='Created' /><Value IncludeTimeValue='TRUE' Type='DateTime'>" +
    DiscussionLastUpdated + "</Value></Eq></Where>" ;
    DataTable dt = web.GetSiteData(query);
    foreach (DataRow row in dt.Rows)
    {
    Response.Write(row["Author" ] + "" + row["Body" ] + " Last by :" + row["DiscussionLastUpdated" ] +
    "<br />" );
    Response.Write("<hr style='color=red'>" );
    }
    }
    }
    public void GetDisBoard()
    {
    using (SPSite site = new SPSite("http://moss:5000" ))
    using (SPWeb web = site.RootWeb)
    {
    SPList list = web.Lists["Team Discussion" ];
    //获取帖子
    foreach (SPListItem spListItem in list.Folders)
    {
    GetQuery(spListItem["DiscussionLastUpdated" ] + "" );
    }
    }
    }

    Anything Is Possible !
    2010年11月29日 5:48
  • 建议除非特殊原因,不要使用SPSiteDataQuery,原因如下: 1、这个东西没有分页机制,只能一次获取前几条或者全部; 2、这个东西不能设置Folder的范围,某些场景下使用不合适; 3、这个东西只能查同一种BaseType的列表(当然总比只能查一个列表的SPQuery要高级); 4、这个东西有一个非常恶心的bug,当范围内的列表数超过10的时候,就有可能出现查询结果错误,你在google上搜一下“SPSiteDataQery bug”就能找到了……
    2010年12月9日 15:58
  • 好的,谢谢你的建议...
    Anything Is Possible !
    2010年12月13日 2:47