积极答复者
如何获取Team Discussion中 每个Topic 的最后回复人?

问题
-
如图:下面只显示了创建者,最后回复的时间, 但是我想通过代码获取 最后回复的人! 这样这个看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 !
答案
-
你可以使用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
全部回复
-
你可以使用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
-
非常感谢你给我提供的帮助,用下面代码我已测试通过 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 ! -
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 !