MOSS 2010:Visual Studio 2010开发体验(15)——LINQ to SharePoint
這一篇我們來討論的是,如何通過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
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的MOSS 2010:Visual Studio 2010开发体验(15)——LINQ to SharePoint的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Opening
- 下一篇: Enterprise Library 5