这一篇我们来讨论的是,如何通过LINQ的技术实现对SharePoint 2010列表的读取。我还记得当年.NET Framework 3.5发布,第一次接触到Linq的时候那种不可思议的感觉。现在,SharePoint的开发也支持Linq啦,这真是一件值得欢欣鼓舞的事情。

这篇文章的所有练习都基于下面这样列表。这个列表显示了员工的信息。作为演示目的,我只是添加了三个范例数据

目前针对MOSS 2010的开发,需要使用框架.NET Framework 3.5 而不是.NET Framework 4.0,而且编译的目标必须设置为Any CPU,或者X64。否则会出现一些莫名其妙的情况。这些是需要注意的,详细的介绍请参考我在下面这个博客文章

http://www.cnblogs.com/chenxizhang/archive/2010/04/04/1704116.html

在讲LINQ to SharePoint之前,我们稍微回顾一下之前是怎么访问SharePoint 列表的。我们会用到SharePoint所提供的组件对象模型(Object Model)去做,具体来说,我们大致有下面两种常见的做法

【注意】如果你对SharePoint的对象模型不清楚,下面这篇文章可以帮助你理解 http://www.cnblogs.com/chenxizhang/archive/2010/04/05/1704550.html

1. 通过读取SPList.Items

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using Microsoft.SharePoint;namespace ConsoleApplication1
{class Program{static void Main(string[] args){var url = "http://localhost:45223/sites/dev";using (SPSite site = new SPSite(url)){using (SPWeb web = site.OpenWeb()){SPList list = web.Lists["Employees"];foreach (SPListItem item in list.Items){Console.WriteLine("FullName:{0},{1}  Age:{2}",item["FirstName"],item["LastName"],item["Age"]);}}}}}
}

以上的代码是读取所有的员工的,假设我们要做筛选呢,例如我们只想看到那些年龄小于60岁的员工资料,我们会怎么做呢?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using Microsoft.SharePoint;namespace ConsoleApplication1
{class Program{static void Main(string[] args){var url = "http://localhost:45223/sites/dev";using (SPSite site = new SPSite(url)){using (SPWeb web = site.OpenWeb()){SPList list = web.Lists["Employees"];foreach (SPListItem item in list.Items){
                         Console.WriteLine("FullName:{0},{1}  Age:{2}",item["FirstName"],item["LastName"],item["Age"]);}}}}}
}

没错,这可以实现我们的目的。其实如何结合LINQ to Object的技术,我们还可以像下面这样写代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using Microsoft.SharePoint;namespace ConsoleApplication1
{class Program{static void Main(string[] args){var url = "http://localhost:45223/sites/dev";using (SPSite site = new SPSite(url)){using (SPWeb web = site.OpenWeb()){SPList list = web.Lists["Employees"];foreach (SPListItem item in query){Console.WriteLine("FullName:{0},{1}  Age:{2}",item["FirstName"],item["LastName"],item["Age"]);}}}}}
}

 

看起来不错,而且我们这里其实也用到了Linq的语法,不是吗?但大家要注意一下,上面三种写法,不管有没有进行筛选,也不管是否用到了LINQ语法,它们都有一个很大的问题,就是:他们都是把所有的SPListItem读取过来,然后再做处理的(例如做筛选),这意味着什么呢?

假设列表的项目很多,例如有成千上万个员工记录,然而我们这个程序其实只要用到其中的一个员工,大家可以试想一下会是多大的一个资源浪费的操作。基于这样的理由,所以以前我们用得更多的可能是下面这种做法

2. 通过CAML语法

CAML是一个特殊的标记语言吧,它的全称是Collaborative Application Markup Language(协作应用程序标记语言)。这里有一个链接,如果有兴趣的朋友可以了解一下

http://msdn.microsoft.com/zh-cn/library/ms426449.aspx

这篇文章中,我们的重点当然不是介绍CAML,只是演示一下如何使用它来定义查询语法,对列表进行筛选。

【注意】CAML的功能不仅仅限于列表查询,它甚至可以定义列表,和网站结构等等。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using Microsoft.SharePoint;namespace ConsoleApplication1
{class Program{static void Main(string[] args){var url = "http://localhost:45223/sites/dev";using (SPSite site = new SPSite(url)){using (SPWeb web = site.OpenWeb()){SPList list = web.Lists["Employees"];SPQuery query = new SPQuery();
foreach (SPListItem item in list.GetItems(query)){Console.WriteLine("FullName:{0},{1}  Age:{2}",item["FirstName"],item["LastName"],item["Age"]);}}}Console.Read();}}
}

这个例子中,我们使用了一个全新的类型,SPQuery。它可以定义一串查询的语句。而SPList的GetItems方法就可以使用这个Query对象进行过滤。注意,这是在服务器端就过滤掉了数据,而不会把所有的SPListItem读取到我们的程序中来了。

很显然的一个问题是,如果让你手工编写这个查询语句,恐怕是一件很困难的事情。所以以前我们一般都需要借助一些外部工具。其中最出名的一个工具就是U2U提供的CAML Query builder。

关于如何使用U2U这个工具,以及有关注意事项,我之前也有一篇文章介绍

http://www.cnblogs.com/chenxizhang/archive/2009/10/23/1588415.html

CAML确实可以帮助我们实现灵活的查询,但无论如何,它的语法还是相对来说晦涩难懂的。所以,有一位叫bdesmet的开发人员实现了一套LINQ Provider,名称就是linqtoSharepoint,你可以通过下面的网站了解到有关信息

http://linqtosharepoint.codeplex.com/

【注意】这是一个开源项目,虽然名称很接近,但我们这篇博客文章并不是讨论它的使用。事实上,如果你还在使用MOSS 2007的话,它可能对你有些帮助。但我们现在如果使用MOSS 2010的话,就没有必要了。因为现在是内置了这个支持。

【注意】我曾经在MOSS 2007的使用用过这个插件,但效果不尽如人意,尤其是如果你的网站中的列表是用中文命名的话。所以,如果你遇到了一些问题,也不必感到特别的诧异。

3. 使用MOSS 2010全新的 LINQ 支持特性

我们终于要切入正题了:如何使用MOSS 2010的LINQ特性来改善开发体验,以及它与之前的方法有何差别呢?

为了使用LINQ的功能,我们第一步需要用一个工具生成一个代码文件,这个文件包含了所有列表的一个实体类。

该工具叫SPMetal.exe,它的位置一般是在C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\BIN目录中。

通过类似下面这样的方式执行该工具

该工具所生成的实体类文件大致如下

有了这个文件,接下来我们就可以将它添加到项目中,并且基于它编写代码来实现对列表的查询了。

在该文件中,你发现有很多错误的提示。这是因为我们还没有添加一个程序集的引用。

添加Microsoft.SharePoint.Linq.dll的引用,该程序集一般在c:\Program Files\Common Files\Microsoft Shared\web server extensions\14\ISAPI目录中

添加完引用之后,编译该项目,确保没有任何错误。

接下来,我们看看代码应该如何修改

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;using Microsoft.SharePoint;namespace ConsoleApplication1
{class Program{static void Main(string[] args){var url = "http://localhost:45223/sites/dev";EntitiesDataContext ctx = new EntitiesDataContext(url);var query = from item in ctx.Employeeswhere item.Age < 60select item;foreach (var item in query){Console.WriteLine("FullName:{0},{1} Age:{2}",item.FirstName,item.LastName,item.Age);}Console.Read();}}
}

WOW, 我只能说,这样写代码的感觉是非常棒的:强类型、有智能感知支持、没有类型转换问题、更不需要记住那些晦涩难懂的CAML语句。。。。。。

这就是LINQ的魅力吧,你也赶紧试试吧

转载于:https://www.cnblogs.com/chenxizhang/archive/2010/04/26/1721573.html

MOSS 2010:Visual Studio 2010开发体验(15)——LINQ to SharePoint相关推荐

  1. MOSS 2010:Visual Studio 2010开发体验(19)——ECMAScript Object Model

    这篇文章部分材料摘自下面这个地址,我做了翻译,并且按照我的案例场景做了补充 http://www.codeproject.com/Articles/60348/SharePoint-2010-Clie ...

  2. MOSS 2010:Visual Studio 2010开发体验(26)——工作流开发概述

    这一篇开始,我将介绍在MOSS 2010中进行工作流开发的最佳实践.这一篇主要介绍有关的几个概念 1.什么是工作流 工作流开发是这几年都比较火的一个领域.工作流,顾名思义就是工作的流程,而软件系统所要 ...

  3. MOSS 2010:Visual Studio 2010开发体验(16)——客户端对象模型

    转载自:http://www.cnblogs.com/chenxizhang/archive/2010/04/26/1721653.html 上一篇,我们讲到了LINQ to SharePoint.它 ...

  4. 关于在Office 2010,Visual Studio 2010环境下开发Office 2007解决方案的问题

    Office解决方案分应用级解决方案(application-level solution 也就是Add-in)和文档级解决方案(document-level solution包括Excel temp ...

  5. MOSS 2010:Visual Studio 2010开发体验(14)——列表开发之事件接收器

    通过前面几篇,我们已经完成了内容类型,列表定义,列表实例的开发.本篇继续讲解列表中的一个重要环节--事件接收器开发. 我们的场景是:我希望之前做好的订单列表这个内容类型自动地具有某些事件特征,例如当用 ...

  6. MOSS 2010:Visual Studio 2010开发体验(22)——利用BCS和WCF进行应用程序集成

    上一篇,我们讲到了如何利用BCS服务,直接连接到SQL Server数据库实现一些简单的应用程序集成的场景.看起来很不错,不是吗? 但是,事实上,直接连接到数据库也许有时候是不可能实现的任务,很多系统 ...

  7. Visual Studio 2010 美女与程序员的爱情网剧+《耀和你一起》壁纸包

    微软这次给 Visual Studio 2010 做的广告转向了美女+感情的套路,特意为产品拍了一套爱情短剧视频,讲述美女与程序员的爱情,这给无数本来就是单身宅男的程序员们提供了不少YY的空间. 在爱 ...

  8. ASP.NET 4 和 Visual Studio 2010 Web 开发概述

    声明:本文是ASP.NET 白皮书 ASP.NET 4 and Visual Studio 2010 Web Development Overview 的阅读摘要,只是本人的学习记录,并非完整翻译,仅 ...

  9. Visual Studio 2010 Ultimate敏捷测试驱动开发

    在微软Visual Studio 2010 Ultimate Beta2版本中,MSF for Agile Software Development 5.0过程框架,是以Scrum模型为基础导向扩展, ...

最新文章

  1. 【图论专题】BFS中的双向广搜 和 A-star
  2. 你居然还不知道Mysql存储引擎InnoDB分为内存架构、磁盘架构?
  3. 【Python 自然语言处理 第二版】读书笔记1:语言处理与Python
  4. 自学编程的 6 个技巧总结
  5. WebKit中的Chrome和ChromeClient
  6. deactivate_sending在创建新的table entry时的作用
  7. Beetlex服务网关1.8发布
  8. C++实现数组模拟链表(实现链表的增删功能)
  9. PHP数组 转 对象/对象 转 数组
  10. java栈最小值的实现,关于java:算法图解如何找出栈中的最小值
  11. IEEE 回应禁止华为系审稿人;Wi-Fi 联盟等恢复华为成员资格;Angular 8 正式发布 | 极客头条...
  12. 剑指offer面试题48. 最长不含重复字符的子字符串(滑动窗口)
  13. 怎么复原java项目文件_从jar包还原出java源码(项目文件)
  14. H12-211数通HCNA题库解析(一)
  15. 在Ubuntu Linux Server上使用奔图P2206NW打印机
  16. XGBoost结合SHAP应用:回归、二分类、多分类模型
  17. 一步一步教你写股票走势图——分时图四(高亮联动)
  18. New Phyto | 沈其荣团队李荣等解析生物有机肥培育抑病土壤的根际菌群抵御病原菌入侵的机制...
  19. 神来之笔之傅里叶变换(频谱)
  20. 用Mothur制作OTUtable

热门文章

  1. AMIO编辑器开发(三):转向C++,月底遇到第二个瓶颈
  2. php选择符和举例子,关于CSS3中选择符的实例详解
  3. python接口自动化接口依赖_Python接口自动化之mock模块简单使用
  4. write up:杂项 又一张图片,还单纯吗 --图片提取
  5. hihocoder#1041 : 国庆出游(DFS)
  6. 2021云上架构与运维峰会将于12月4日在上海举办,五大精彩看点不容错过
  7. 用 RTC 打造一个音乐教育 App,需要解决哪些音质难题?
  8. 阿里云伯俊软件:强强联合,共建新生态
  9. 如何实现Java类隔离加载?
  10. LOL手游男枪怎么玩?国服第一给观众讲解,上王者就靠他了