Sharepoint-server-object-model

提供:Dev Guides
移動先:案内検索

SharePoint-サーバーオブジェクトモデル

この章では、SharePoint Serverオブジェクトモデルについて説明します。 SharePointのコンテキスト内で実行するコードを記述するときは、SharePoint Serverオブジェクトモデルを使用します。 一般的な例としては、ページまたはWebパーツのコードビハインド、機能またはリストの背後にあるイベントハンドラー、タイマージョブなどがあります。

サーバーオブジェクトモデルの機能

サーバーオブジェクトモデルの主な機能は次のとおりです。

  • SharePointで使用されるのと同じアプリケーションプール内でASP.NETアプリケーションをプログラミングする場合は、サーバーオブジェクトモデルを使用できます。
  • サーバーオブジェクトモデルは、コンソールやWindowsフォームなどのクライアントアプリケーション、またはSharePointサーバーで実行されるWPFアプリを開発している場合に使用できます。
  • サーバーオブジェクトモデルを使用して、SharePoint Serverにリモート接続することはできません。
  • サーバーオブジェクトモデルを使用する場合、 Microsoft.SharePoint アセンブリを参照します。 サーバーオブジェクトモデルを構成する他のアセンブリもありますが、Microsoft.SharePointがメインです。
  • 最も一般的に使用するコアタイプは、エンドユーザーとして使用するコンポーネントにマップされるため、サイトコレクション、サイト、リスト、ライブラリ、リストアイテムなどは、SPSite、SPWeb、SPList、SPDocumentLibrary、およびSPListItem。
  • サイトコレクションを表す型とサーバーオブジェクトモデルはSPSiteであり、サーバーオブジェクトモデルでSharePointサイトを表す型はSPWebです。 したがって、エンドユーザーの用語から開発者の用語に移行するときは、メンタルマッピングを行うだけで済みます。

これで、SharePointの使用を初めて開始すると、サイトが過負荷になり、Webボキャブラリはもちろんのこと、エンドユーザーと開発者のボキャブラリの反対を意味するため、混乱を招く可能性があります。

サーバーオブジェクトモデルの簡単な例を見てみましょう。

ステップ1 *-Visual Studioを開き、 *File→New→Project メニューオプションから新しいプロジェクトを作成します。

  • ステップ2 *-左ペインの*テンプレート→Visual C#*からWindowsを選択し、中央のペインでコンソールアプリケーションを選択します。 プロジェクトの名前を入力し、[OK]をクリックします。
  • ステップ3 *-プロジェクトが作成されたら、ソリューションエクスプローラーでプロジェクトを右クリックし、*追加→参照*を選択します。

コンソールアプリケーション

  • ステップ4 *-左ペインで[アセンブリ]→[拡張機能]を選択し、中央ペインで[Microsoft.SharePoint]をオンにして[OK]ボタンをクリックします。

ソリューションエクスプローラーでプロジェクトをもう一度右クリックし、[プロパティ]を選択します。

アセンブリ

  • ステップ5 *-左ペインの[ビルド]タブをクリックし、[32ビットを優先する]オプションをオフにします。

ビルドタブ

ステップ6 *- *Program.cs ファイルに戻り、次のコードに置き換えます。

using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SharePointData {
   class Program {
      static void Main(string[] args) {
         using (var site = new SPSite("http://waqasserver/sites/demo")) {
            var web = site.RootWeb;
            Console.WriteLine(web.Title);
            var lists = web.Lists;

            foreach (SPList list in lists) {
               Console.WriteLine("\t" + list.Title);
            }
            Console.ReadLine();
         }
      }
   }
}

-上記のコードでは、最初に新しいSPSiteオブジェクトを作成しました。 これは使い捨てのオブジェクトなので、usingステートメント内で作成されます。 SPSiteコンストラクターは、サイトコレクションへのURLを受け取りますが、これは場合によって異なります。

var web = site.RootWeb は、サイトコレクションのルートを取得します。

web.Listsを使用してリストを取得し、リストアイテムのタイトルを印刷できます。

上記のコードをコンパイルして実行すると、次の出力が表示されます-

SharePoint Tutorials
   appdata
   Authors
   Composed Looks
   Contacts
   Course Documents
   Courses
   Documents
   List Template Gallery
   Master Page Gallery
   Site Assets
   Site Pages
   Solution Gallery
   Style Library
   Theme Gallery
   User Information List
   Web Part Gallery

これらのタイトルは、ソリューションギャラリー、スタイルライブラリ、フォームテンプレートであることがわかります。 これらは、SharePointによって内部的に使用されるリストです。 したがって、すべてのリストを表示するのではなく、ユーザーに通常表示されるリストのみを表示したい場合があります。

したがって、リストコレクション全体を取得する代わりに、非表示ではないすべてのリストを取得する必要があります。 以下のリンククエリを使用してこれを行うことができます。

using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ServerObjectModel {
   class Program {
      static void Main(string[] args) {
         using (var site = new SPSite("http://waqasserver/sites/demo")) {
            var web = site.RootWeb;
            Console.WriteLine(web.Title);
            var lists = from SPList list in web.Lists
            where list.Hidden == false
            select list;

            foreach (SPList list in lists) {
               Console.WriteLine("\t" + list.Title);
            }
            Console.ReadLine();
         }
      }
   }
}

上記のコードをコンパイルして実行すると、次の出力が表示されます-

SharePoint Tutorials
   Authors
   Contacts
   Course Documents
   Courses
   Documents
   Site Assets
   Site Pages
   Style Library

これにより、非表示ではないすべてのリストが返されることがわかります。

リスト項目に関する情報も表示する別の簡単な例を見てみましょう。

using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ServerObjectModel {
   class Program {
      static void Main(string[] args) {
         using (var site = new SPSite("http://waqasserver/sites/demo")) {
            var web = site.RootWeb;
            Console.WriteLine(web.Title);
            var lists = from SPList list in web.Lists
            where list.Hidden == false
            select list;

            foreach (SPList list in lists) {
               Console.WriteLine("\t" + list.Title);
               var items = list.Items.OfType<SPListItem>().Take(5);
               var isDocLib = list is SPDocumentLibrary;

               foreach (SPListItem item in items) {
                  var value = isDocLib ? item.Name : item.Title;
                  Console.WriteLine("\t\t" + value);
               }
            }
            Console.ReadLine();
         }
      }
   }
}

上記のコードをコンパイルして実行すると、次の出力が表示されます-

SharePoint Tutorials
   Authors
      Muhammad Waqas
      Mark Upston
      Allan Bommer
      Andy Onian
   Contacts
      Waqas
      Upston
      Bommer
   Course Documents
      Sample1.docx
      Sample2.docx
      Sample3.docx
   Courses
      SharePoint Tutorials
      C# Tutorials
      ASP.Net Tutorials
      NHibernate Tutorials
   Documents
   Site Assets
   Site Pages
      Home.aspx
      How To Use This Library.aspx
   Style Library

リストデータ

リストを初めて作成するときは、常にタイトル列があります。 この[タイトル]列では、デフォルトで、リストアイテムのコンテキストまたはコントロールブロックの編集メニューにアクセスできます。

すべてのリストは列タイトルで始まるため、 SPListItem タイプはそれをプロパティとして公開します。 すべてのリストに共通ではない列については、 SpListItem タイプのインデクサーを介してアクセスできます。

いくつかの情報をインデクサーに渡すことができますが、最も一般的なのは Column です。 リスト設定のエンドユーザーは、この名前を変更できます。 この名前は変更される可能性があるため、使用しないでください。

2つ目は InternalName で、このリストが作成された時点で設定され、変更されることはありません。 これは、列の値にアクセスするときに使用する名前です。

以下に示すように著者リストを取得する簡単な例を見てみましょう-

単純な例

この例では、Authorsリストを取得し、Salary/Rateをある値だけ上げます。 したがって、Salary/Rate列には、 InternalName を使用します。

  • ステップ1 *-サーバーエクスプローラーに移動します。 * SharePoint接続*を右クリックして、[接続の追加…​]を選択します。 URLを指定して[OK]をクリックします。

SharePoint接続

ステップ2 *- SharePointチュートリアル→リストライブラリ→リスト→作成者→フィールド→給与/レート*フィールドを展開します。 Salary/Rate を右クリックして、[プロパティ]を選択します。 [プロパティ]ウィンドウに InternalName が表示されます。

SharePointチュートリアル

  • ステップ3 *-以下は、給与/レートに基づいて著者を取得し、給与/レートを引き上げる簡単な例です。
using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ServerObjectModel {
   class Program {
      static void Main(string[] args) {
         using (var site = new SPSite("http://waqasserver/sites/demo")) {
            var web = site.RootWeb;
            var list = web.Lists.TryGetList("Authors");
            if (list == null)
            return;
            var items = list.Items;
            ShowItems(items);
            RaiseRates(items);
            Console.WriteLine("\nAfter Raise\n");
            ShowItems(items);
            Console.ReadKey();
         }
      }
      static void RaiseRates(SPListItemCollection items) {
         foreach (SPListItem item in items) {
            var employee = Convert.ToBoolean(item["Employee"]);
            var rate = Convert.ToDouble(item["Salary_x002f_Rate"]);
            var newRate = employee ? rate + 1 : rate + 0.1;
            item["Salary_x002f_Rate"] = newRate;
            item.Update();
         }
      }
      static void ShowItems(SPListItemCollection items) {
         foreach (SPListItem item in items) {
            Console.WriteLine("Salary or rate for {0} is {1:c}", item.Title,
            item["Salary_x002f_Rate"]);
         }
      }
   }
}

上記のコードでは、2つのメソッドがあることがわかります-

  • 1つは、 ShowItems という名前のリストを取得することです。
  • もう1つの方法は、* RaiseRates()*と呼ばれるレートを上げることです。

上記のコードをコンパイルして実行すると、次の出力が表示されます-

Salary or rate for Muhammad Waqas is $950.00
Salary or rate for Mark Upston is $15.00
Salary or rate for Allan Bommer is $20.00
Salary or rate for Andy Onian is $870.00

After Raise

Salary or rate for Muhammad Waqas is $951.00
Salary or rate for Mark Upston is $15.10
Salary or rate for Allan Bommer is $20.10
Salary or rate for Andy Onian is $871.00

CAMLクエリ

上記の例では、foreachループを使用してすべての項目を何度も繰り返して項目を常に繰り返し、常にすべての列を戻すか、少なくともすべての列がアクセス可能になっています。

これは、SQLクエリでテーブル名からselect *を実行することに本当に似ています。

  • CAMLクエリ*と呼ばれるものを使用して、この問題に対処できます。 CAMLクエリを実行する場合、2つのオプションがあります-
  • 単一のリストのみを照会する場合は、SPQueryオブジェクトを使用できます。
  • サイトコレクション内の複数のリストを照会する場合は、SPSiteDataQueryを使用できます。

通常、 SPSiteDataQuery を実行している場合、特定のタイプのすべてのリストを照会しています。

たとえば、すべての連絡先リストなどを照会したい SPSiteDataQueryを使用すると、スコープを決定できるため、サイトコレクション全体、個々のサイト、またはサイトとそのすべての子に対してクエリを実行することを指定できます。

CAMLクエリの構文は基本的にXML形式で記述されており、これらの種類のクエリの構築に慣れるには少し時間がかかります。

CAMLクエリの簡単な例を見てみましょう。 ここでは、著者リストのデータをクエリするCAMLクエリを作成します。

using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ServerObjectModel {
   class Program {
      static void Main(string[] args) {
         using (var site = new SPSite("http://waqasserver/sites/demo")) {
            var web = site.RootWeb;
            var list = web.Lists.TryGetList("Authors");
            if (list == null)
            return;
            var items = QueryItems(list);
            ShowItems(items);

           //RaiseRates(items);
           //Console.WriteLine("\nAfter Raise\n");
           //ShowItems(items);
            Console.ReadKey();
         }
      }
      static SPListItemCollection QueryItems(SPList list) {
         var query = new SPQuery();

         query.ViewFields =
            "<FieldRef Name='Title'/>" +
            "<FieldRef Name='Employee'/>" +
            "<FieldRef Name='Salary_x002f_Rate'/>";

         query.Query =
            "<OrderBy>" +
            " <FieldRef Name='Salary_x002f_Rate'/>" +
            "</OrderBy>" +
            "<Where>" +
            " <Eq>" +
            " <FieldRef Name='Employee'/>" +
            " <Value Type='Boolean'>False</Value>" +
            " </Eq>" +
            "</Where>";
         return list.GetItems(query);
      }
      static void RaiseRates(SPListItemCollection items) {
         foreach (SPListItem item in items) {
            var employee = Convert.ToBoolean(item["Employee"]);
            var rate = Convert.ToDouble(item["Salary_x002f_Rate"]);
            var newRate = employee ? rate + 1 : rate + 0.1;
            item["Salary_x002f_Rate"] = newRate;
            item.Update();
         }
      }
      static void ShowItems(SPListItemCollection items) {
         foreach (SPListItem item in items) {
            Console.WriteLine("Salary or rate for {0} is {1:c}",
            item.Title,
            item["Salary_x002f_Rate"]);
         }
      }
   }
}

CAMLクエリを使用していくつかのアイテムを取得しました。 QueryItems メソッドでは、Employeeではないアイテムのみを取得したことがわかります。

Salary or rate for Mark Upston is $15.10
Salary or rate for Allan Bommer is $20.10