(四)使用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: }

最新文章

  1. Eclipse几个版本号的区别
  2. CA 证书
  3. eclipse创建web项目
  4. CSMA-CA介绍
  5. 【HDOJ】1061 Rightmost Digit
  6. Javascript substr方法在某些浏览器下行为出现BUG的补丁代码
  7. 纯命令行教你Cocoapods的安装和使用
  8. 【创建型】Abstract Factory模式 &amp; Factory Method模式
  9. COJ 0244 HDNOIP201404最短路径
  10. c语言,动态数组
  11. NM常用网络命令
  12. 索引图像(X与map)的显示、保存、转化
  13. SQL server 数据库——表连接(多表横向连接,纵向连接)
  14. HierarchyID 数据类型用法
  15. idea热部署
  16. Python 解决命令行删除、退格乱码问题
  17. Ncurses-窗口
  18. C# winform 弹出确认消息框
  19. Java虚拟机垃圾回收:内存分配与回收策略 方法区垃圾回收 以及 JVM垃圾回收的调优方法
  20. 3. Dubbo原理解析-Dubbo内核实现之动态编译 (转)

热门文章

  1. 数据结构 - 归并排序(merging sort)
  2. Ubuntu下PHP的扩展
  3. 实现TabView(页签)效果
  4. 【转】NPOI 单元格级别应用
  5. [转]WPF/MVVM快速开始手册
  6. Table_EXISTS_ACTION=APPEND时导入数据时
  7. 详解MemCached原理
  8. ef 更新导航属性
  9. react native之组织组件
  10. ECMASCRIPT 6中字符串的新特性