SharePoint 服务器端对象模型 之 使用LINQ进行数据访问操作(Part 2)
2016-02-28 15:17
711 查看
(四)使用LINQ进行列表查询
在生成实体类之后,就可以利用LINQ的强大查询能力进行SharePoint列表数据的查询了。在传统SharePoint对象模型编程中,需要首先获取网站对象,再进行其他操作;使用LINQ也是类似,对数据的访问和操作都要先获取DataContext网站,之后再通过这个DataContext进行数据访问。
1、获取网站和列表
DataContext的创建同样也是要使用绝对路径进行构造,并使用GetList方法获取相应的列表。例如下面的代码获取Chapters列表中所有的章节信息:
当然,我们也可以直接使用所生成的强类型的DataContext,并直接获取相应的列表,如下面的代码所示:
2、进行列表查询
使用LINQ,就可以方便快捷地进行列表查询,无需再编写复杂的CAML查询,下面的例子查找了在Chapters列表中,名称包含“数据”的章节信息:
由于在生成的实体类中,查阅项是通过相应的实体引用的方式实现的,在进行列表关联查询的时候就会变得异常方便。在之前介绍使用CAML进行列表关联查询的时候,我们曾经假设了一个“订单 – 销售 – 城市”的例子,仍以这个查询为例,通过下面的代码就可以便捷地查询到所有北京销售的订单信息:
从这些例子我们可以看到,通过使用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进行实际列表查询的,如下例所示:
在生成实体类之后,就可以利用LINQ的强大查询能力进行SharePoint列表数据的查询了。在传统SharePoint对象模型编程中,需要首先获取网站对象,再进行其他操作;使用LINQ也是类似,对数据的访问和操作都要先获取DataContext网站,之后再通过这个DataContext进行数据访问。
1、获取网站和列表
DataContext的创建同样也是要使用绝对路径进行构造,并使用GetList方法获取相应的列表。例如下面的代码获取Chapters列表中所有的章节信息:
using (DataContext ctx = new DataContext("http://sp2010/book"))
{
EntityList<Chapters项目> chapters =
ctx.GetList<Chapters项目>("Chapters");
foreach(Chapters项目 chp in chapters)
Console.WriteLine(chp.Name);
}
当然,我们也可以直接使用所生成的强类型的DataContext,并直接获取相应的列表,如下面的代码所示:
using (BookDataContext ctx =
new BookDataContext("http://sp2010/book"))
{
foreach(Chapters项目 chp in ctx.Chapters)
Console.WriteLine(chp.Name);
}
2、进行列表查询
使用LINQ,就可以方便快捷地进行列表查询,无需再编写复杂的CAML查询,下面的例子查找了在Chapters列表中,名称包含“数据”的章节信息:
using (BookDataContext ctx =
new BookDataContext("http://sp2010/book"))
{
var dataChapters = from chp in ctx.Chapters
where chp.Name.Contains("数据")
select chp;
foreach(var chp in dataChapters)
Console.WriteLine(chp.Name + ":" + chp.Writer);
}
由于在生成的实体类中,查阅项是通过相应的实体引用的方式实现的,在进行列表关联查询的时候就会变得异常方便。在之前介绍使用CAML进行列表关联查询的时候,我们曾经假设了一个“订单 – 销售 – 城市”的例子,仍以这个查询为例,通过下面的代码就可以便捷地查询到所有北京销售的订单信息:
using (DemoDataContext ctx =
new DemoDataContext("http://sp2010"))
{
var bjOrders = from order in ctx.Orders
where order.Saler.City.标题 == "北京"
select order;
foreach (var order in bjOrders)
{
Console.WriteLine(string.Format("{0}卖了{1}套{2}。",
order.Saler.标题, order.Amount, order.标题));
}
}
从这些例子我们可以看到,通过使用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进行实际列表查询的,如下例所示:
using (BookDataContext ctx =
new BookDataContext("http://sp2010/book"))
{
StringBuilder builder = new StringBuilder;
StringWriter writer = new StringWriter(builder);
ctx.Log = writer;
var dataChapters = from chp in ctx.Chapters
where chp.Name.Contains("数据")
select chp;
foreach(var chp in dataChapters)
Console.WriteLine(chp.Name + ":" + chp.Writer);
// 输出查询过程中所实际使用的CAML:
writer.Flush();
Console.WriteLine(builder.ToString());
}
相关文章推荐
- IOS Http断点续传浅析
- 字典集合Dictionary<K,V>和构造的应用==>>体检套餐项目
- OC基础--常用类的初步介绍与简单实用之NSString
- POJ2833 The Average(优先队列/堆排序)
- 求最近30的起始日期
- 多图片上传
- Maven教程-01安装
- 关于设置浮动改变行内元素display属性的问题
- html语义化
- Linux内核分析第一周-通过分析汇编代码理解计算机是如何工作的
- bzoj 1228 [SDOI2009]E&D(sg函数,找规律)
- 二叉树遍历遐想
- 最小表示法的学习
- JS闭包小结
- uva 11134 传说中的车 从简单情形入手
- 一个高效的UI才是一个拉风的UI(二)
- 【codevs】4633 树链剖分入门
- 关于安装MySQLdb出现fatal error: my_config.h: No such file or directory
- 个人学习-java-抽象类(abstract class)
- sass @extend