WCF Data Servicesの新機能 – 射影

TechDaysが終わって少々時間が経ってしまいましたが、解説とデモを紹介したいと思います。今回から複数回に分けてご紹介いたします。

このシリーズの目次は以下になります。
1) WCF Data Servicesの新機能 – 射影
2) WCF Data Servicesの新機能 – カウント
3) WCF Data Servicesの新機能 – Server Driven Paging(SDP)
4) WCF Data Servicesの新機能 – Feed Customization
5) WCF Data Servicesの新機能 – データバインド
6) WCF Data Servicesの新機能 – カスタムプロバイダ1
7) WCF Data Servicesの新機能 – カスタムプロバイダ2
8) WCF Data Servicesの新機能 – リクエストパイプライン
9)Open Data Protocolの実装 – Share Point Server 2010のデータを操作する

■まずは名称の変更から
昨年の11月に開催されたPDCのタイミングで、ADO.NET Data Servicesは今後WCF Data Servicesと名称が変更になることが発表になっています。ただし、従来(.NET Framework 3.5 SP1)からあるものに関してはそのままの名称で扱われます。あくまでも今後出る.NET Framework4ベースのモノに関してのお話になります。とは言え両方の名前を認識している必要があると思います。このブログではWCF Data Servicesの名称を使用します。

■新バージョン
次のバージョンは1.5になります。.NET Framework 3.5 SP1と.NET Framework4ベースの2系統有り、どちらも同じ新機能が実装されています。

■更新モジュール(開発環境)
.NET Framework 3.5 SP1ベースの更新(v1.0⇒v1.5)がダウンロードできるようになっています。
OSによって分かれていますのでご注意ください。もちろん、この更新を適用しても、ADO.NET Data Servicesの名称が変更になるわけではありません。

Windows 2000、Windows Server 2003、Windows XP、Windows Vista、および Windows Server 2008 用 .NET Framework 3.5 SP1 の ADO.NET データ サービス更新プログラム

Windows 7 および Windows Server 2008 R2 用 .NET Framework 3.5 SP1 の ADO.NET データ サービス更新プログラム

.NET Framework4ベースのモノに関してはVisual Studio 2010と同じタイミング(と言うより含まれる)となります。

現在Visual Studio 2010の最新はRC版となっています。ただし英語版のみですので、ご注意ください。
https://www.microsoft.com/japan/visualstudio/try/default.mspx#download
このブログは上記のVS2010RC英語版を使用します。

■射影(サービスとして)
Selectが使用できるようになりました。列の選択ができるので、データ転送量を減らすことが可能になります。

ここからは、WCF Data Servicesでpubsデータベースをそのまま公開するサービスを事前に作成していたことを前提にします。(下図の様にedmxとsvcを作成します。)

image

(注意)=================================
VS2008で新機能を実装するためには、以下の2か所のサービス初期化のコードに手を加える必要があります。

・(変更)IDataServiceConfiguration⇒DataServiceConfiguration
・(追加)config.DataServiceBehavior.MaxProtocolVersion = System.Data.Services.Common.DataServiceProtocolVersion.V2;

結果以下の様になります。

public static void InitializeService(DataServiceConfiguration config) {     config.SetEntitySetAccessRule("*", EntitySetRights.All);     config.DataServiceBehavior.MaxProtocolVersion = System.Data.Services.Common.DataServiceProtocolVersion.V2; }

===========================================

これで射影を確認する状況になりました、以下のリクエストしてみてください。(ホストのアドレスは適当です。)
https://localhost:25872/pubsDataService.svc/employee?$select=fname,lname

データは下図の様に、fnameとlnameのみが選択されます。
image

ちなみに従来は下図の様に全フィールドがデータとして戻ってきていました。

image

他にも特徴的なリクエストとしては、Navigationプロパティ(linkタグ)を含めることが可能です。employeeはjobsと多対1の関係を持っていますので、それを含めるためには以下の様になります。
https://localhost:25872/pubsDataService.svc/employee?$select=lname,jobs

この結果は以下です。初めの例と異なるのはjobsに接続することができるlinkタグが含まれる点です。

image

jobsのデータをinlineに含めると、jobsの列の選択も可能になります。

https://localhost:25872/pubsDataService.svc/employee?$select=fname,lname,jobs/job_desc&$expand=jobs

この結果は以下のです。赤枠がlinkタグの下にあるinlineです。その中にjobsで指定した列が含まれています。

image

■射影(クライアントとして)
.NET Frameworkを使用したクライアントプログラムでも射影を使用することが可能です。

ServiceReference1.pubsEntities context =     new ServiceReference1.pubsEntities(         new Uri("https://localhost:25872/pubsDataService.svc/"));

//射影の使用 var query = from em in context.employee                  select new                  {                     em.fname,                     em.lname,                     em.jobs.job_desc                 };

foreach (var q in query) {     Console.WriteLine(q.job_desc);     Console.WriteLine("\t" + q.fname); }

上記を実行すると、内部的には、以下のアドレスにリクエストが出ています。https://localhost:25872/pubsDataService.svc/employee?$select=fname,lname,jobs/job_desc&$expand=jobs

選択する列を色々と変更してみると、リクエストしているアドレスが変化するので、確認してみると面白いと思います。TechDaysではem.jobs.job_descは含めておらずfnameとlnameのみを選択していましたので、アドレスとしては以下のようになることを紹介しました。https://localhost:25872/pubsDataService.svc/employee?$select=fname,lname