(四)使用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: }