テスターですが何か?

ホビープログラマ略してHPです

WCF Data Services(OData)へ素のLinqToXMLでアクセスする

leave a comment »

前回のエントリーの続きです。ASP.NET WebFormで作成された節電効果計測サービスをAzureへASP.NET MVCへ移行するための課題解決の記録を残しておきます。

今回はデータソース・データアクセスについて検討します。

1つ目はSQLAzureです。現在利用しているEntityFrameworkをそのまま利用することができ、ソースの修正は少しで済むというメリットがあります。ただ、オンプレミス上のSQLServerのデータをどのように移行するのかと、東京電力とYaho! Japanからデータを取得しているWCF Restサービスも同時に移行しなければなりません。そのため、コンテンツを少しずつ移行していくことが難しく、全部完成しないと公開できないという、心の折れる作業になってしまいます。また、SQLAzureは月額料金が別途かかるため、自分のサイフに厳しいサービスになってしまいます。

2つ目は、AzureTableStorageです。月額料金が別途かからないため、最終的にはこの形になるのだろうと思っていますが、全く経験のないテクノロジーのため短期間で構築することが難しいと思います。また、データ移行の方法がよく分からないことと、データの移行を行わないとコンテンツを公開できないので、スピード感が落ちてしまいます。

3つ目は、オンプレミス上のサービスで公開しているWCF Data Services(OData)をデータソースとしてコンテンツを作成し始めることです。コンテンツの作成とデータ移行方法の検討を並行して進めます。コンテンツが完成した時点でデータの移行と、外部データ取得のWCF Restサービスの移行を行います。Azure上にコンテンツを構築していくのと並行してオンプレミス上のコンテンツも必要があれば更新していく必要があります。

以上、3つの方法を考えた結果、3つ目の案にしようと思います。いきなりはデータソースは移行せずにコンテンツを作成し、最後にデータの移行を行おうと思います。で、最初の課題となるのはWCF Data Services(OData)のデータソースへどのようにアクセスするかということです。OData自体はXML形式なので、LinqToXMLでアクセスできると思うのですが、MSDNを調べるとDataServiceContextを使用してLinqでアクセスするサンプルしか見つけることしかできませんでした。DataServiceContextを使用するためにはサービス参照をしなければならず、素(プレーン)じゃないんですよね。SOAPよりもRESTの方が好きな性癖を持っている自分としては、DataServiceContext経由ではなく、素のLinqToXMLでデータアクセスをしたいと思います。

では、ソースを作成します。データソースは以下のURLです。

http://david9142f14.ddo.jp/LightElectricityService/UsageOdata.svc/PowerSaving?$filter=Date%20eq ‘20110503’

重要なデータ部分は以下のようになっています。
 
<content type="application/xml">
      <m:properties>
        <d:Seq m:type="Edm.Int32">20717</d:Seq>
        <d:Date>20110503</d:Date>
        <d:Hour m:type="Edm.Int32">0</d:Hour>
        <d:TodayUsage m:type="Edm.Int32">2364</d:TodayUsage>
        <d:PreviousDayUsage m:type="Edm.Int32">2301</d:PreviousDayUsage>
        <d:PreviousDaySaving m:type="Edm.Double">-2.74</d:PreviousDaySaving>
        <d:PreviousYearUsage m:type="Edm.Int32">2486</d:PreviousYearUsage>
        <d:PreviousYearSaving m:type="Edm.Double">4.91</d:PreviousYearSaving>
        <d:UsageForecast m:type="Edm.Int32">2364</d:UsageForecast>
      </m:properties>
    </content>

そして、ソースは以下のようになります。

public class PowerSavingRepository

{

    private const string APIUrl = "http://david9142f14.ddo.jp/LightElectricityService/UsageOdata.svc/PowerSaving?$filter=Date eq ";

    private XNamespace m = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";

    private XNamespace d = "http://schemas.microsoft.com/ado/2007/08/dataservices";

    public IEnumerable<PowerSaving> GetPowerSavingDataByDate(string targetDate)

    {

        var APIData = XDocument.Load(APIUrl + "’" + targetDate + "’");

        var PowerSavingList = new List<PowerSaving>();

        PowerSaving PowerSaving = null;

        foreach (var ps in APIData.Descendants(m + "properties"))

        {

            PowerSaving = new PowerSaving()

            {

               Date = ps.Element(d + "Date").Value,

               Hour = int.Parse(ps.Element(d + "Hour").Value),

               TodayUsage = int.Parse(ps.Element(d + "TodayUsage").Value),

               PreviousDayUsage = int.Parse(ps.Element(d + "PreviousDayUsage").Value),

               PreviousDaySaving = double.Parse(ps.Element(d + "PreviousDaySaving").Value),

               PreviousYearUsage = int.Parse(ps.Element(d + "PreviousYearUsage").Value),

               PreviousYearSaving = double.Parse(ps.Element(d + "PreviousYearSaving").Value),

               UsageForecast = int.Parse(ps.Element(d + "UsageForecast").Value)

            };

            PowerSavingList.Add(PowerSaving);

        }

        return PowerSavingList;

    }

}

ソースの解説です。

  • インスタンス変数部分で、データソース(OData)のURLとXML名前空間の宣言を行っています。
  • XDocument.Loadメソッドの引数はXMLファイルのパスではなく、ODataのURLを指定しています。
  • XDocument.Loadではなく、XElement.Loadでもいいです。(たぶんXElementのほうがいいと思う)
  • ODataのURLから日付でデータのフィルタを行っています。($fileter=Date eq ‘日付’でフィルタされます)
  • XDocument/XElement.Descendantsメソッドの引数を「名前空間 + 要素名」で指定します。XMLデータ内で名前空間つきで要素が宣言されているので、引数に名前空間を指定しないとデータを取得することができません。

作成したソースはここにアップしておきます。/Models/Repositories/PowerSavingRepository.csが今回作成したODataを素のLinqToXMLでアクセスしている部分です。次回はASP.NET MVCでグラフを作成する方法を検討します。

Written by david9142

2011年5月3日 @ 11:07 PM

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。