(四)使用LINQ进行列表查询编程
在生成实体类以后,就能够利用LINQ的强大查询能力进行SharePoint列表数据的查询了。在传统SharePoint对象模型编程中,须要首先获取网站对象,再进行其余操做;使用LINQ也是相似,对数据的访问和操做都要先获取DataContext网站,以后再经过这个DataContext进行数据访问。app
一、获取网站和列表学习
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: }
二、进行列表查询ui
使用LINQ,就能够方便快捷地进行列表查询,无需再编写复杂的CAML查询,下面的例子查找了在Chapters列表中,名称包含“数据”的章节信息:spa
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的智能感知和编译时检查,也不容易出现因失误所形成的代码运行错误。code
三、查看查询过程当中的CAMLorm
因为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: }