在讲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)
{ if(int.Parse(item["Age"].ToString())<60) 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"];
var query = from SPListItem item in list.Items
where int.Parse(item["Age"].ToString()) < 60
select item;
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"];
有了这个文件,接下来我们就可以将它添加到项目中,并且基于它编写代码来实现对列表的查询了。
在该文件中,你发现有很多错误的提示。这是因为我们还没有添加一个程序集的引用。
添加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.Employees
where item.Age < 60
select item;