SharePoint 服务器端对象模型 之 使用LINQ进行数据访问操作(Part 2)

(四)使用LINQ进行列表查询

在生成实体类之后,就可以利用LINQ的强大查询能力进行SharePoint列表数据的查询了。在传统SharePoint对象模型编程中,需要首先获取网站对象,再进行其他操作;使用LINQ也是类似,对数据的访问和操作都要先获取DataContext网站,之后再通过这个DataContext进行数据访问。

1、获取网站和列表

DataContext的创建同样也是要使用绝对路径进行构造,并使用GetList方法获取相应的列表。例如下面的代码获取Chapters列表中所有的章节信息:

   1: using (DataContext ctx = new DataContext("http://sp2010/book"))
   2: {
   3:     EntityList<Chapters项目> chapters = 
   4:     ctx.GetList<Chapters项目>("Chapters");
   5:     foreach(Chapters项目 chp in chapters)
   6:         Console.WriteLine(chp.Name);
   7: }

当然,我们也可以直接使用所生成的强类型的DataContext,并直接获取相应的列表,如下面的代码所示:

   1: using (BookDataContext ctx = 
   2:     new BookDataContext("http://sp2010/book"))
   3: {
   4:     foreach(Chapters项目 chp in ctx.Chapters)
   5:         Console.WriteLine(chp.Name);
   6: }

2、进行列表查询

使用LINQ,就可以方便快捷地进行列表查询,无需再编写复杂的CAML查询,下面的例子查找了在Chapters列表中,名称包含“数据”的章节信息:

   1: using (BookDataContext ctx = 
   2:     new BookDataContext("http://sp2010/book"))
   3: {
   4:     var dataChapters = from chp in ctx.Chapters
   5:                        where chp.Name.Contains("数据")
   6:                            select chp;
   7:     foreach(var chp in dataChapters)
   8:         Console.WriteLine(chp.Name + ":" + chp.Writer);
   9: }

由于在生成的实体类中,查阅项是通过相应的实体引用的方式实现的,在进行列表关联查询的时候就会变得异常方便。在之前介绍使用CAML进行列表关联查询的时候,我们曾经假设了一个“订单 – 销售 – 城市”的例子,仍以这个查询为例,通过下面的代码就可以便捷地查询到所有北京销售的订单信息:

   1: using (DemoDataContext ctx = 
   2:     new DemoDataContext("http://sp2010"))
   3: {
   4:     var bjOrders = from order in ctx.Orders
   5:                    where order.Saler.City.标题 == "北京"
   6:                       select order;
   7:     foreach (var order in bjOrders)
   8:     {
   9:         Console.WriteLine(string.Format("{0}卖了{1}套{2}。",
  10:             order.Saler.标题, order.Amount, order.标题));
  11:     }
  12: }

从这些例子我们可以看到,通过使用LINQ to SharePoint以及生成的数据实体类,在编写列表查询的时候可以更加直观、便捷,由于Visual Studio的智能感知和编译时检查,也不容易出现因失误所造成的代码运行错误。

3、查看查询过程中的CAML

由于LINQ to SharePoint会在底层根据列表的结构将查询转换成CAML形式的查询,因此使用LINQ to SharePoint在效率上比传统的CAML查询略低一些(经笔者测试,在小数据集上大约要慢10%至20%左右),主要消耗时间的部分在于将LINQ查询转换为CAML查询的过程,因此当数据量较大的时候,这个转换所带来的时间消耗相对就要小很多了。

出于效率考虑,或者出于学习CAML的目的,我们有时希望能够看到LINQ翻译成CAML之后的翻译结果。在DataContext中,也提供了这样的机制,我们可以通过Log属性观察到在LINQ查询的时候是使用怎样的CAML进行实际列表查询的,如下例所示:

   1: using (BookDataContext ctx = 
   2:     new BookDataContext("http://sp2010/book"))
   3: {
   4:     StringBuilder builder = new StringBuilder;
   5:     StringWriter writer = new StringWriter(builder);
   6:     ctx.Log = writer;
   7:  
   8:     var dataChapters = from chp in ctx.Chapters
   9:                        where chp.Name.Contains("数据")
  10:                            select chp;
  11:     foreach(var chp in dataChapters)
  12:         Console.WriteLine(chp.Name + ":" + chp.Writer);
  13:  
  14:     // 输出查询过程中所实际使用的CAML:
  15:     writer.Flush();
  16:     Console.WriteLine(builder.ToString());
  17: }
时间: 2024-12-21 05:19:38

SharePoint 服务器端对象模型 之 使用LINQ进行数据访问操作(Part 2)的相关文章

SharePoint服务器端对象模型 之 使用LINQ进行数据访问操作(Part 3)

(五)使用LINQ进行数据更新 LINQ to SharePoint的优势不仅在于可以方便快捷地进行SharePoint列表数据查询,SPMetal所生成的数据实体类实际上是一个支持双向同步的模型,也就是意味着通过DataContext我们还可以将数据的变动提交到SharePoint列表中. 通过DataContext进行数据提交主要分成三个阶段:(1)确保DataContext支持数据提交,即其中的ObjectTrackingEnabled属性为true(默认值):(2)修改数据实体的内容:(

SharePoint服务器端对象模型 之 使用CAML进展数据查询

SharePoint服务器端对象模型 之 使用CAML进行数据查询 一.概述 在SharePoint的开发应用中,查询是非常常用的一种手段,根据某些筛选.排序条件,获得某个列表或者某一些列表中相应的列表条目的集合. 除去列表上的查询之外,在SharePoint中还大量存在着各种各样的查询,比如针对回收站的SPRecycleBinQuery.针对审计的SPAuditQuery.针对变更的SPChangeQuery等等,不过这些查询在实际项目中使用到的频率并不是很高.本章节还是着重介绍列表查询功能.

SharePoint服务器端对象模型 之 使用CAML进行数据查询

(一)概述 在SharePoint的开发应用中,查询是非常常用的一种手段,根据某些筛选.排序条件,获得某个列表或者某一些列表中相应的列表条目的集合. 除去列表上的查询之外,在SharePoint中还大量存在着各种各样的查询,比如针对回收站的SPRecycleBinQuery.针对审计的SPAuditQuery.针对变更的SPChangeQuery等等,不过这些查询在实际项目中使用到的频率并不是很高.本章节还是着重介绍列表查询功能. 在SharePoint 2010之前,列表查询的查询语句都是通过

SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 4)

(五)列表查询中的阈值限制 在之前版本的SharePoint 中,如果在查询的时候没有指定返回数目,那么SharePoint将会查找该列表中所有的条目,这可能会造成在SQL表中需要返回大量的条目,极大影响了数据库的I/O性能和网络负载,如果返回的条目数量超过一定范围之后,SQL Server会把整张数据表锁定.我们知道在SharePoint中,所有的列表条目信息都是存储在同一张SQL Server数据表中的,这也就意味着,一个设计的不好的列表查询,可能会导致整个SharePoint的其他应用都停

SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 2)

(三)使用SPQuery进行列表查询 1.概述 列表查询主要是指在一个指定的列表(或文档库)中按照某些筛选.排序条件进行查询.列表查询主要使用SPQuery对象,以及SPList的GetItems方法,将SPQuery作为参数传递,返回查询到的列表条目集合,即SPListItemCollection类型. 在使用SPQuery进行列表查找的时候,其中一些属性指定了其查找的特性: Query属性:通过该属性指定CAML格式的筛选条件和排序条件(见上文),如果不指定,则默认返回范围内的所有条目: F

SharePoint服务器端对象模型 之 使用CAML进行数据查询(Part 3)

(四)使用SPSiteDataQuery进行多列表查询 1.概述 前面介绍的列表查询有很多优势,但是它的一个缺点就是一次只能在一个列表中进行查询,在SharePoint中,提供了一个跨网站.跨列表查询的机制.通过使用SPSiteDataQuery对象,以及SPWeb的GetSiteData方法,将SPSiteDataQuery作为参数,可以进行跨网站和跨列表的查询. 它与列表查询的相同之处在于: (1) 使用同样的Query属性确定筛选条件和排序条件(不支持分组条件): (2) 使用同样的Vie

SharePoint服务器端对象模型 完结

整个系列已完结,大概看了一眼,平均阅读量不到200.估计也没什么人看了,而且服务器端对象模型除了在某些企业开发中会用到,从2013时代开始其实已经不是SharePoint开发的最佳选择了.不过既然已经开了坑,还是把坑填完了. 以下是汇总的文章列表目录(共23篇): 序言 对象模型概述(Part 1) 对象模型概述(Part 2) 访问网站和列表数据(Part 1) 访问网站和列表数据(Part 2) 访问网站和列表数据(Part 3) 访问网站和列表数据(Part 4) 访问网站和列表数据(Pa

SharePoint服务器端对象模型 之 对象模型概述(Part 2)

(三)Url 作为一个B/S体系,在SharePoint的属性.方法参数和返回值中,大量的涉及到了Url,总的来说,涉及到的Url可以分为如下四类: 绝对路径:完整的Url,包含了协议头(http或https).端口号.主机名等等,例如:http://myserver/subweb/documents/myfolder/myfile.doc.在SharePoint中,必须要使用绝对路径的机会并不是很多.一些网站级别对象的属性为绝对路径,例如spWeb.Url和spSite.Url. 相对服务器路

开启貌似已经过时很久的新坑:SharePoint服务器端对象模型

5年前(嗯,是5年前),SharePoint 2010刚发布的时候,曾经和kaneboy试图一起写一本关于SharePoint 2010开发的书,名字叫<SharePoint 2010 应用开发指南>(涂指南这个名字不是白叫的).给大家看一下当年列出来的大纲: SharePoint 2010开发概览 SharePoint 2010基础架构,SharePoint与ASP.NET.IIS的关系 解释服务器场的概念,从硬件拓扑层次解释APP.WFE 解释Web应用程序.网站集.网站.列表和文档库的概