SharePoint中的列表(List) 与Content Type 之三
对列表数据使用查询
你可以使用SPQuery对象来获得列表中的具体结果. 当使用SPQuery对象的时候, 你需要创建CAML语句来选择在目标列表中的具体数据. 为了选择已经过期的announcements , 你也许会需要像下面的例子一样使用CAML语句:
SPQuery query = new SPQuery(); query.ViewFields = @"<FieldRef Name='Title'/><FieldRef Name='Expires'/>"; query.Query = @"<Where> <Lt> <FieldRef Name='Expires' /> <Value Type='DateTime'> <Today /></Value> </Lt> </Where>"; SPList list = site.Lists["Litware News"]; SPListItemCollection items = list.GetItems(query); foreach (SPListItem expiredItem in items) { Console.WriteLine(expiredItem["Title"]); }
你必须指明你想要在query中返回的fields, 方法是使用ViewFields 属性. 还要注意, 你必须使用field name来指定field, 而不是DisplayName. 如果你试图访问fields而不在ViewFields中指定, 你会遇到类型的ArgumentException的异常.
基本的query的语法是:
“<Where><operator><operand /><operand /></operator> </Where>”
下表列出了你会在query中使用的基本的CAML, 更完整的列表, 你需要查看SDK.
Element |
Description |
And |
聚合多个条件 |
BeginsWith |
在文本域中从头搜索字符串 |
Contains |
在文本域中搜索字符串 |
Eq |
相等 |
FieldRef |
引用一个field(对GroupBy元素很有用) |
Geq |
大于等于 |
GroupBy |
通过这些field来分组 |
Gt |
大于 |
IsNotNull |
非空 |
IsNull |
是空 |
Leq |
小于或等于 |
Lt |
小于 Less Than |
Neq |
不等于 |
Now |
当前的日期和时间 |
Or |
布尔或操作符 |
OrderBy |
排序query的结果 |
Today |
今天的日期 |
TodayIso |
ISO格式的今天的日期 |
Where |
用来指定查询的Where子句 |
SPQuery是一个从单个列表中拿数据的很棒的方法. 更进一步的是, 当你想要查找符合某种条件的列表项是, 使用SPQuery可以比遍历所有列表项的速度明显地加快. 然而, WSS 3.0引入了一种新的query机制, 引入的方式是通过SPSiteDataQuery 类. 使用SPSiteDataQuery 类执行query能够从整个站点集的多个不同的列表中返回列表项. 基于这个原因, 在跨站点查询一般指的就是使用SPSiteDataQuery 的查询.
正如你在最后的例子中见到的, 使用SPQuery对象的查询返回一个SPListItemCollection. 使用SPSiteDataQuery 的查询就不一样了, 因为他们返回的是一个ADO.NET的DataTable对象. 与SPQuery一样, 在DataTable中也可以以field的形式返回columns. 比如说, 假设一个场景, 你运行一个查询, 查询站点集中的每一个基于Announcements 类型的列表, 要求返回所有今天创建的Items. 下面的代码示例会展示如何通过创建一个SPSiteDataQuery 对象, 初始化必要的CAML语句, 然后传递他们给当前SPWeb对象的来GetSiteData 方法, 来满足我们的需求,
//A "Recently Published" Feed using System; using System.Web; using Microsoft.SharePoint; using System.Data; using System.Xml; using Microsoft.SharePoint.Utilities; namespace Litware.ContentWebParts.Handlers { public class RecentPostsHandler : IHttpHandler { public bool IsReusable { get { return true; } } public void ProcessRequest(HttpContext context) { SPWeb web = SPContext.Current.Web; SPSiteDataQuery query = new SPSiteDataQuery(); query.ViewFields = @"<FieldRef Name=""Title""/><FieldRef Name=""PostCategory""/> <FieldRef Name=""PublishedDate""/><FieldRef Name=""Body""/> <FieldRef Name=""Author""/><FieldRef Name=""Permalink""/> <FieldRef Name=""ContentType""/>"; string queryText = @"<Where> <And> <Eq> <FieldRef Name=""ContentType"" /> <Value Type=""Text"">Post</Value> </Eq> <Eq> <FieldRef Name=""PublishedDate"" /> <Value Type=""DateTime""><Today /></Value> </Eq> </And> </Where>"; query.Query = queryText; query.Webs = @"<Webs Scope='Recursive' />"; DataTable table = web.GetSiteData(query); context.Response.ContentType = "text/xml"; XmlTextWriter xw = new XmlTextWriter(context.Response.Output); xw.WriteStartElement("rss"); xw.WriteAttributeString("version", "2.0"); xw.WriteStartElement("channel"); xw.WriteElementString("title", "Recently Published: " + web.Title); xw.WriteElementString("description", "Recently published posts from " + web.Url); xw.WriteElementString("link", web.Url); foreach (DataRow row in table.Rows) { xw.WriteStartElement("item"); xw.WriteElementString("title", (string)row["Title"]); xw.WriteElementString("description", ((string)row["Body"])); xw.WriteElementString("pubDate", row["PublishedDate"].ToString("r")); string author = row["Author"].ToString().Split(new string[] { ";#" }, StringSplitOptions.None)[1]; xw.WriteElementString("author", author); string category = row["PostCategory"].ToString().Split(new string[] { ";#" }, StringSplitOptions.None)[1]; xw.WriteElementString("category", category); string link = string.Format(@"/Lists/Posts/Post.aspx?ID={0}", row["Permalink"].ToString()); xw.WriteElementString("link", link); xw.WriteEndElement(); //item } xw.WriteEndElement(); //channel xw.WriteEndElement(); //rss } } }
摘译自:
Inside WSS 3.0 第六章