LINQ to SharePoint の使用

最終更新日: 2010年5月6日

適用対象: SharePoint Foundation 2010

ここでは、Microsoft SharePoint Foundation ソリューションの中で LINQ (Language Integrated Query) クエリを使用できる LINQ to SharePoint プロバイダーの概要について説明します。このプロバイダーでは、オプティミスティック同時実行制御を使用してデータを変更することもできます。LINQ to SharePoint では、オブジェクト変更の追跡と競合の解決もサポートされています。

LINQ および LINQ プロバイダー

LINQ は、プログラミング言語 C# および Microsoft Visual Basic .NET の機能です。コンパイラは Visual Studio に付属しています。

LINQ により SQL のような構文とボキャブラリが各言語に追加され、それらを使用してデータ ソースのクエリを実行できます。ただし、データ ソースの種類に応じて変化する他の言語やクエリ構文とは異なり、LINQ を使用すると、原則として、どのようなデータ ソースのクエリも実行できます。このため、開発者によっては、このクエリ構文のみ理解していれば十分です。

LINQ でデータ ソースにアクセスできるためには、そのデータ ソース用の LINQ プロバイダーを作成することだけが必要です。LINQ プロバイダーは、Microsoft .NET Framework (System.Core.dll) に含まれている System.Linq.IQueryable<T> インターフェイスおよび System.Linq.IQueryProvider インターフェイスの実装です。実装しているクラスは、マネージ コード アセンブリの中でパブリックであることが必要です。IQueryProvider を実装するクラスの第 1 のジョブは、LINQ クエリを、SQL、XQuery など、データ ソースの言語に変換し、データ ソースのアプリケーションを呼び出してクエリを実行することです。

プロバイダーは、データ ソースと通信できるインスタンスを持つゲートウェイ クラスで、IEnumerable<T> オブジェクトを出力できるゲートウェイ クラスを公開する必要もあります。たとえば、LINQ to SQL のゲートウェイ クラスは DataContext であり、LINQ to XML (英語) のゲートウェイ クラスは XDocument です。ゲートウェイ クラスは、System.Linq.IQueryable<T> を実装するか、これを実装した子プロパティを持つか、または System.Linq.IQueryable<T> を実装した型を返すメソッドを持つ必要があります。たとえば、DataContext は、System.Linq.IQueryable<T> を実装した Table<TEntity> 型を返す GetTable() メソッドを持ちます。後者のインターフェイスは、次に、IQueryProvider 型のプロパティを持ちます (ゲートウェイ クラスは、IQueryProvider を直接実装することもできます)。これが、クエリが実行される Table<TEntity> 型のオブジェクトです。

.NET ソリューション開発者は、特定の SQL データベースの特定のテーブルなど、データ ソース内の下位のエンティティを表すエンティティ クラスのセットを作成しない限り、ほとんどの場合は LINQ プロバイダーを使用できません。多くの場合、多数のこのようなクラスを作成する必要があるため (30 を超すテーブルで構成されるデータベースなど)、LINQ プロバイダーの開発者は、通常、コード生成ツールを用意して、このようなエンティティ クラスを作成するプロセスを自動化します。

LINQ について

SharePoint to LINQ Provider の操作を開始する前に、開発者は、LINQ の概要と, .NET Framework 付属の LINQ to SQL プロバイダーおよび特別な LINQ to Objects (英語) プロバイダーとの連携について理解する必要があります。

Microsoft Developer Network (MSDN) には、LINQ および .NET Framework に組み込まれているプロバイダーに関する情報が、ビデオを含めて、非常に詳しく記載されています。これに関して多数の書籍もあります。

LINQ to SharePoint プロバイダー

LINQ to SharePoint プロバイダーは、Microsoft.SharePoint.Linq 名前空間で定義されています。このプロバイダーにより、LINQ クエリが Collaborative Application Markup Language (CAML) クエリに変換されます。開発者が CAML クエリの作成方法を知る必要はありません。LINQ クエリはサーバー コードで使用できます。クライアント アプリケーションからクエリを実行するには、SharePoint の ADO.NET Data Services サポートを使用します。

LINQ to SharePoint プロバイダーのゲートウェイ クラスは、SharePoint Foundation Web サイトのデータを表す Microsoft.SharePoint.Linq.DataContext です。これは、LINQ to SQL プロバイダー内の System.Data.Linq.DataContext クラスに対して並行して使用され、機能します。後者のクラスが、System.Linq.IQueryable<T> を実装した Table<TEntity> オブジェクトを返す GetTable() メソッドを持つように、Microsoft.SharePoint.Linq.DataContext クラスも、System.Linq.IQueryable<T> を実装した EntityList<TEntity> クラスを返す GetList<T> メソッドを持ちます。これが、要求される EntityList<TEntity> 型のオブジェクトです。

次に、LINQ を使用して SharePoint Foundation のクエリを実行する例を示します。

// Get DataContext from page context
DataContext data = new DataContext(SPContext.Current.Web.Url);

// Get the SharePoint list
EntityList<Customer> Customers = data.GetList<Customer>("Customers");

// Query for customers from London
var londonCustomers = from customer in Customers
                      where customer.City == "London"
                      select customer;

foreach (var londonCust in londonCustomers)
{
    Console.Writeline("id = {0}, City = {1}", 
                      londonCust.CustomerId, 
                      londonCust.City);
}

LINQ to SharePoint を使用してクエリを実行する詳細については、「[方法] LINQ to SharePoint を使用してクエリを実行する」を参照してください。

次に、LINQ を使用して SharePoint Foundation リストにアイテムを追加する例を示します。

// Get DataContext from page context
DataContext data = new DataContext(SPContext.Current.Web.Url);

// Get the SharePoint list
EntityList<Customer> Customers = data.GetList<Customer>("Customers");

// Create the item to be added
Customer newCustomer = new Customer() { CustomerId=36, City=”Madrid” };

// Mark the item to be added on the next call of Submit
Customers.InsertOnSubmit(newCustomer);

// Submit all changes
data.SubmitChanges();

LINQ to SharePoint を使用したリスト アイテムの追加、編集、および削除の詳細については、「[方法] LINQ to SharePoint を使用してコンテンツ データベースに書き込む」を参照してください。

関連項目

参照

Microsoft.SharePoint.Linq.DataContext

EntityList<TEntity>

GetList<T>

IEnumerable<T>

System.Linq.IQueryable<T>

IQueryProvider

Microsoft.SharePoint.Linq

その他の技術情報

LINQ to Objects (英語)

LINQ to SQL: リレーショナル データのための .NET 統合言語クエリ

LINQ to XML (英語)