SharePoint项目中经常会对列表、文档库、网站等进行操作,涉及到的类型包括Site\Web\List\ListItem\Folder等,SharePoint有其原始的查询方法Caml,缺点是查询语句复杂且不容易读懂,最重要的是Caml是用字符串或者GUID作为KEY来查询,在实际应用中很容易出错。针对SharePoint这一问题,微软引入了LINQtoSharePoint来进一步简化SharePoint中的查询、筛选。但事实上,LINQtoSharePoint在性能方面并不一定会优于直接使用caml查询,因为LINQtoSharePoint是将查询转换为caml语句,再进行查询,自然会有更大的系统开销。无论如何,这是微软主推的一项技术,有必要了解,在实际数据量不是很大的应用中,编程过程也会更简单一些。
一、LinqtoSharePoint
首先LinqtoSharePoint编程语言C#和MicrosoftVisualBasic.NET的一个功能,编译器是VisualStudio附带的。
LinqtoSharePoint是LINQ家族中的一员,如果使用过例如LinqtoSQL的话,就会发现LinqtoSharePoint与其有很多相同之处。
如LinqtoSQL中有DataContext类,用来打开数据库连接并进行操作。LinqtoSharePoint也有DataContext,同样用来对SharePoint中的数据进行操作。
二、SPMetal
1、使用默认代码生成规则
如果没有特殊要求,默认规则就可以满足程序的要求。
步骤一、打开命令行CMD
步骤二、cd到%ProgramFiles%\CommonFiles\MicrosoftShared\webserverextensions\15(SharePoint2010则替换为12)\BIN
2、使用参数XML文件改变默认值
使用XML作为参数传递给SPMetal生成代码,是一种拓展方法,可以改变生成类的名称,指定List包含的列等。
一般我们希望生成的实体类都是与真实SharePoint结构相同的,如相同的列表名,想用的列名。
所以,如果没有特殊要求,可以不忽略此节。
参数XML的结构是:
上面介绍了LinqtoSharePoint的一些主要内容,下面是介绍如何使用LinqtoSharePoint。
using(SPefDataContextSDataContext=newSPefDataContext(siteurl)){varitemcol=(frompolicyinSDataContext.PolicyGuidewhere条件(例如:policy.Title!=null)selectpolicy).Skip(num1).Take(num2).OrderBy(p=>p.CreateTime);}上述代码只是一个简单的示例,首先新建DataContext类,这样就可以使用强类型的LinqtoSharePoint了,Linq的语法大家应该都懂,Skip用来获取指定位置开始的数据,Take指定获取的数据数量,orderby指定排序规则。
LinqtoSharePoint允许建立列表之间的连接,但必须是有引用字段。在这里要说明一下,LinqtoSharepoint会将所有SPlistItem都取出后,再进行筛选,这会造成一定的性能问题。所以要使用Take()方法,这样在生成的caml语句中,就会限定只获取一条数据。如果想要查看每次linqtoSharePoint生成的Caml语句,可以通过Datacontext的Log属性获取。
三、使用LinqtoSharePoint文档修改
首先从文档库中查找到需要修改的数据item,对item修改后,调用DataContext.SubmitChanges()方法,这样LinqtoSharePoint就会对更改的项进行更新。
四、提升权限
在使用LinqtoSharePoint操作数据时,当前用户可能不具有操作权限,这是可以参考SharePoint服务器端模型中的SPSecurity.RunWithElevatedPrivileges方法。
这个大家应该都用过,也不属于本文的内容,只作为一个提示。
优缺点总结:
1、LinqtoSharePoint是强类型,易操作。
2、LinqtoSharePoint查询方便,不需要知道Caml怎么写。
3、LinqtoSharePoint不仅支持查询,还可以删除、修改。
4、LinqtoSharePoint会产生性能问题
5、LinqtoSharePoint对有些列表会有限制,如一些自定义的内容
无论如何,LinqtoSharePoint也会是操作SharePoint数据的一个趋势,等待微软能更加完善它。