Sharepoint-server-object-model
この章では、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]をクリックします。
ステップ2 *- SharePointチュートリアル→リストライブラリ→リスト→作成者→フィールド→給与/レート*フィールドを展開します。 Salary/Rate を右クリックして、[プロパティ]を選択します。 [プロパティ]ウィンドウに InternalName が表示されます。
- ステップ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