SharePoint 2013 列表数据操作与SPQuery

本文主要介绍在代码中对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元素

扫描二维码关注公众号,回复: 12883196 查看本文章

示例代码如下

            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语句了。
使用界面

猜你喜欢

转载自blog.csdn.net/u012835032/article/details/79192841