本文主要介绍在代码中对SharePoint列表数据的操作
1、列表的增删改
2、LINQ在SPList中的使用
3、列表查询对象SPQuery的使用
4、多表查询
5、Caml语言生成器介绍
环境:Windows Server 2012,SharePoint 2013,Visual Studio 2013
前言
关于怎么在VS中创建SharePoint 列表,可以参考SharePoint 2013 列表(代码篇)。对于列表的操作,其实SharePoint本身已经提供了相对完善的列表数据操作的功能,用它原生的功能我们在界面操作就可以完成很多功能开发,不需要写代码,这个也是用SharePoint的好处。那么我们为什么还要去折腾这种烦人(写代码其实还是很有趣的)的东西,原因也很简单,客户嘛,总是会有一些奇怪的需求(罪过罪过,甲方爸爸最大),用原生的无法满足用户需求的时候(也有可能是我们用原生的不知道怎么做),就需要我们去自定义一些东西(比如WebPart、事件接收器、定时器(其实是TimerJob,作业,我习惯叫它定时器,你们不要理我)),去实现一些特殊的功能,如:根据某些条件给用户发邮件、流程管理、报表等等。废话就不多说了,下面进入正题。
列表数据操作
1、新增数据,获得列表→新增一条数据→填写数据→保存
using (SPSite site = new SPSite(siteurl))
{
using (SPWeb web = site.AllWebs[webName])
{
SPList emaillist = web.GetList(web.Url.TrimEnd('/') + "/Lists/EmailMessageList");
SPListItem EMItem = emaillist.Items.Add();
EMItem["EmailContent"] = d.EmailContent;
EMItem["MailingAddress"] = d.MailingAddress;
EMItem["IsSend"] = "0";
EMItem.Update();
}
}
2、更新数据,跟新增差不多,就是那个新增一条数据变成获取一条数据
using (SPSite site = new SPSite(siteurl))
{
using (SPWeb web = site.AllWebs[webName])
{
SPList emaillist = web.GetList(web.Url.TrimEnd('/') + "/Lists/EmailMessageList");
SPListItem EMItem = emaillist.GetItemById(2);
EMItem["EmailContent"] = d.EmailContent;
EMItem["MailingAddress"] = d.MailingAddress;
EMItem["IsSend"] = "0";
EMItem.Update();
}
}
3、删除数据,这个就更简单了,直接调用Delete()删除一条数据就行
item.Delete()
LINQ for SPList
LINQ大家都熟,我就不废话了。
引入命名空间 using System.Linq;
把列表数据转成List
using (SPWeb web = SPContext.Current.Web)
{
SPList emailList = web.GetList(web.Url.TrimEnd('/') + "/Lists/EmailMessageList");
List<SPListItem> items = emailList.Items.OfType<SPListItem>().ToList();
}
一般的查询操作
using (SPWeb web = SPContext.Current.Web)
{
SPList emailList = web.GetList(web.Url.TrimEnd('/') + "/Lists/EmailMessageList");
List<SPListItem> items = emailList.Items.OfType<SPListItem>().ToList();
//获取未发送(IsSend == 0)的邮件
var ic = emailList.Items.OfType<SPListItem>().Where(a => (a["IsSend"]+"").Equals("0"));
//获取某一条数据
SPListItem item = emailList.Items.OfType<SPListItem>().FirstOrDefault(o => (o["UniqueId"] + "").Equals("e9904e1a-473a-42ad-811a-855gh7964b87"));
//分页
var list = emailList.Items.OfType<SPListItem>().OrderBy(o => o["Created"]).Skip(0).Take(10);
}
是不是很熟悉。。。
我在代码里面用到了var,希望你们不要像我。。。
列表查询对象SPQuery的使用
MSDN对列表查询对象SPQuery的介绍。下面介绍一下它的几个常用属性
Query – 获取或设置查询中使用的内部XML
ViewFields – 获取或设置在查询中返回的字段
Joins – 获取或设置查询 (包括其所有子元素的加入元素部分)
ProjectedFields – 获取或设置查询,列举联接的外部列表中的字段,以便它们可以在其中的元素和ViewFields元素中引用的 XML 的ProjectedFields元素
示例代码如下
using (SPWeb web = SPContext.Current.Web)
{
SPList emailList = web.GetList(web.Url.TrimEnd('/') + "/Lists/EmailMessageList");
DateTime tiem1 = DateTime.Parse("2018-01-01T00:00:00Z");
var sTime = SPUtility.CreateISO8601DateTimeFromSystemDateTime(tiem1);
DateTime tiem2 = DateTime.Parse("2018-01-31T00:00:00Z");
var eTime = SPUtility.CreateISO8601DateTimeFromSystemDateTime(tiem2);
SPQuery query = new SPQuery();
string caml = @"<Where>
<And>
<Gt>
<FieldRef Name='Created' />
<Value IncludeTimeValue='TRUE' Type='DateTime'>" + sTime + @"</Value>
</Gt>
<Lt>
<FieldRef Name='Created' />
<Value IncludeTimeValue='TRUE' Type='DateTime'>" + eTime + @"</Value>
</Lt>
</And>
</Where>";
query.Query = caml;
SPListItemCollection items = emailList.GetItems(query);
}
多表查询
SharePoint的多表查询是通过 SPQuery 的 Joins 实现的。
<Join Type='LEFT' ListAlias='TestList'><Eq><FieldRef Name='TestList' RefType='ID'/><FieldRef List='TestList' Name='ID'/></Eq></Join>
Type – 连接类型,LEFT为左连接
ListAlias – 别名,可以跟连接的表一样
FieldRef Name=’TestList’ RefType=’ID’– 这个是主表的关联字段(必须是Lookup)
FieldRef List=’TestList’ Name=’ID’ – 外连表与字段
合起来就是根据主表ID获取数据
示例代码
using (SPWeb web = SPContext.Current.Web)
{
SPList emailList = web.GetList(web.Url.TrimEnd('/') + "/Lists/EmailMessageList");
SPQuery query = new SPQuery();
query.Query = @"<Where>
<IsNotNull>
<FieldRef Name='ID' />
</IsNotNull>
</Where>
<OrderBy><FieldRef Name='Created' Ascending='False' /></OrderBy>";
query.Joins = "<Join Type='LEFT' ListAlias='TestList'><Eq><FieldRef Name='TestList' RefType='ID'/><FieldRef List='TestList' Name='ID'/></Eq></Join>";
query.ProjectedFields = @"<Field Name='TID' Type='Lookup' List='TestList' ShowField='ID'/>
<Field Name='TTitle' Type='Lookup' List='TestList' ShowField='Title'/>";
SPListItemCollection items = emailList.GetItems(query);
}
多表查询需要注意
1、主表的关联字段必须是Lookup
2、读取外连表的字段必须是Lookup,就是SPQuery 的 ProjectedFields 里面的字段不管原来是什么类型,在这里必须是Lookup
3、在实际应用中,这个多表查询有一个问题,就是有一些关联表的字段值读取不出来,目前还不清楚导致这种情况的原因
Caml语言生成器介绍
如你所见,在SPQuery的Query里面的字符串是XML,拼接起来不容易,于是乎就出现一个叫Caml语言生成器的东西,下载地址:http://www.pc6.com/softview/SoftView_119772.html
打开之后输入站点地址进去→左边的是站点下面的列表,点击列表名称→右边小列表是列表的字段→选中字段之后点击那个Order By或者Where→然后选中条件→最后点那个小箭头的按钮就可以在下面看到生成的Caml语句了。