エクスポート (0) 印刷
すべて展開

柔軟なクエリのアプリケーションを作成する

更新日: 2014年2月

 

DataMarket ロゴ

Visual Studio でサービス参照を使用して、データ パブリッシャーが柔軟なクエリのデータセットとして指定した Marketplace データセットをプログラムで使用します。

Important重要
サービス参照内のコードは変更しないでください。変更を行うと、正しく機能しなくなり悪影響が生じることがあります。また、変更内容は、サービス参照の更新時に上書きされます。

作業を進める前に、以下が用意されていることを確認してください。

  • 有効な Windows Live ID アカウント。Live ID を持っていない場合は、Windows Live ホーム ページにアクセスしてサインアップします。

  • 有効な Marketplace アカウント。Marketplace を持っていない場合は、「Marketplace アカウントの作成」のトピックの手順を実行してください。

  • アプリケーションで使用する Marketplace の柔軟なクエリのデータセットに対するサブスクリプション。柔軟なクエリのデータセットをサブスクライブしていない場合は、「データのオファーにサブスクライブする」の手順を実行します。

 

セクション 説明

手順 1:Visual Studio でプロジェクトを作成する

Visual Studio で Marketplace の新しいコンソール プロジェクトを開始する手順。

手順 2:データ サービスへのサービス参照を追加する

Marketplace データを使用するサービス参照の追加に必要な手順。

手順 3:マネージ コードでデータを使用する

Marketplace の柔軟なクエリのデータセットを使用するために記述するコード。

完成したコード

C# および VB の完全なコンソール アプリケーション。

メタデータ

この柔軟なクエリのデータセットの XML メタデータの例。

Visual Studio を管理者として実行する

  1. [スタート] メニューで [Visual Studio] を探します。

  2. [Visual Studio] を右クリックします。

  3. ドロップダウン メニュー [管理者として実行] をクリックします。

  4. このプログラム (devenv.exe) にコンピューターへの変更を許可するかどうかを確認するメッセージが表示されたら、[はい] をクリックします。

新しいプロジェクトを作成する

  1. Visual Studio の開始ページで [新しいプロジェクト] を選択します。

  2. [新しいプロジェクト] ダイアログで、[Visual C#] と [コンソール アプリケーション] を選択します (Visual Basic を使用する場合は [Visual Basic] と [コンソール アプリケーション] を選択します)。

  3. [新しいプロジェクト] ダイアログ ボックスの上部にある左側のドロップダウン リストから、[.NET Framework 4] を選択します。

    Visual Studio 2010 の既定値は [.NET Framework 4] です。以前のバージョンの Visual Studio を使用していて、.NET Framework 4 がインストールされていない場合は、.NET Framework 4 のダウンロード ページにアクセスしてダウンロードとインストールを行います。

  4. プロジェクトにわかりやすい名前を付けます。たとえば、このプロジェクトには USCrime2006and2007 という名前を付けることができます。

  5. [OK] をクリックします。

  6. Program.cs (Program.vb) の先頭に、データセットへのアクセスを認証するために必要な次のコードを追加します。

    using System.Net; // needed for authentication
    

管理者として Visual Studio を起動し、新しいコンソール アプリケーションを作成したら (ステップ 1)、使用するデータ サービスへのサービス参照を追加します。

サービス ルートの URL を取得する

  1. Marketplace ホーム ページに移動します。

  2. [マイ データ] タブをクリックします。

  3. 2006 - 2008 Crime in the United States データ サービスを検索します。

  4. データセット名の右にある [使用する] をクリックします。このデータセットの [詳細] ページが表示されます。

  5. [Visual Studio でこのデータを使用する方法について] の下のタブまで、ページを下方向にスクロールします。

  6. [詳細] タブをクリックします。

  7. [サービス ルート URL] を探します。

    サービスのルート URL


    図 1-サービス ルート URL

  8. サービス ルート URL をクリップボードにコピーします。

プロジェクトにサービス参照を追加する

  1. Visual Studio プロジェクトに戻ります。

  2. ソリューション エクスプ ローラーで [参照] を右クリックします。

  3. ドロップダウン メニューから [サービス参照の追加] を選択します。

  4. [アドレス] ドロップダウンでクリップボードからサービス ルート URL を貼り付けます。

  5. [実行] をクリックします。
    [サービス] ボックスにプロジェクトで利用可能なサービスが読み込まれるまでしばらく待ちます。

  6. [名前空間] ボックスにわかりやすい名前空間名を入力します。
    例:DataGovCrimes

  7. [OK] をクリックします。
    ソリューション エクスプ ローラーの [サービス参照] の下にサービス参照の名前が表示されます。

コードにサービス参照を追加する

  1. Visual Studio のコード ウィンドウで Program.cs (Program.vb) を選択します。

  2. 次のステートメントを追加します。これにより、アプリケーションがサービス参照にアクセスできるようになります。

    noteメモ
    プログラムの名前空間と、上記 (#6) で作成したサービス参照の名前空間名を使用します。

    using USCrime2006and2007.DataGovCrimes; // using ApplicationName.ServiceReferenceName
    

作業を行うためのクラスを作成する

  1. プロジェクトの名前空間にパブリック クラス CrimeData を作成します。

  2. クラス内に 2 つのプライベート変数を作成します。

    • サービスへの Uri。

    • サービスのコンテキストで、サービスの資格情報を格納するサービス コンテナー。

      エンティティ型を調べる

      1. [詳細] ページに移動します。

      2. [このデータセットを開始する] をクリックします。

      3. [概要] タブをクリックします。
        エンティティ セット名およびエンティティのコレクション名が表示されます。

    
    class CrimeData
    {
        private Uri serviceURI;
        private datagovCrimesContainer context;
    }  // end class CrimeData
    
    
  3. CrimeData クラスのコンストラクターを作成します。
    コンストラクターは、両方のプライベート変数を初期化し、ユーザーの資格情報を初期化します。
    SERVICE_ROOT_URL は、上記でクリップボードにコピーした、https リンクです(「サービス ルートの URL を取得する」を参照)。
    context はユーザーの資格情報用のサービス コンテナーです。
    IgnoreMissingProperties プロパティは、サーバーで型に追加されるプロパティに対するクライアントの堅牢性を高めるため true に設定します(詳細については、MSDN ドキュメントを参照してください)。
    USER_ID は、Live ID です。
    SECURE_ACCOUNT_KEY は、このアプリケーションで使用している Marketplace アカウント キーです(「Marketplace アカウントを管理する」を参照してください)。

    
    class CrimeData
    {
        private Uri serviceURI;
        private datagovCrimesContainer context;
    
        // constructor for the CrimeData class
        public CrimeData()  
        {
            serviceURI = new Uri(SERVICE_ROOT_URL);
            context = new datagovCrimesContainer(serviceURI);
            context.IgnoreMissingProperties = true;
            context.Credentials = new NetworkCredential(USER_ID,
                                                        SECURE_ACCOUNT_ID); // Your Marketplace account key
        }  // end constructor
    
    }  // end class CrimeData
    
    
  4. ジェネリック リストを返すパブリック メソッドをクラス内に作成します。このプログラムのジェネリック リスト型は CityCrime です。
    このメソッドは、サービスのクエリを実行し、成功した場合は結果セットをリストとして返します。何らかの理由でクエリが失敗した場合、メソッドは null (Nothing) を返します。

    
    class CrimeData
    {
        private Uri serviceURI;
        private datagovCrimesContainer context;
    
        // constructor for the CrimeData class
        public CrimeData()
        {
            serviceURI = new Uri(SERVICE_ROOT_URL);
            context = new datagovCrimesContainer(serviceURI);
            context.IgnoreMissingProperties = true;
            context.Credentials = new NetworkCredential(USER_ID,
                                                        SECURE_ACCOUNT_ID);
        }  // end constructor
    
        // -- public method that returns a list of crime data
        public IList<CityCrime> GetCrimeData()
        {
            IEnumerable<CityCrime> query = context.CityCrime.Where(crime => crime.City == "Newport").OrderBy(crime => crime.Year);
    
            try
            {
                return query.ToList();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: {0}", ex.Message);
                return null;
            }  // end try
    
        }  // end function GetCrimeData
    
    }  // end class CrimeData
    
    

    このクエリは任意の有効な Marketplace LINQ クエリで、必要に応じて where (Where) フィルターや orderby (Order By) を含めることができます。
    LINQ クエリの詳細については、「LINQ クエリ式 (C# プログラミング ガイド)、(Visual Basic での LINQ)」を参照してください。
    Marketplace での LINQ クエリの制限事項については、「サポートされる OData クエリ オプション」を参照してください。

    次の LINQ クエリは Marketplace 内で有効です。

    
    query = from crimes in context.CityCrime
                where crimes.City == "Newport" 
                orderby crimes.Year Ascending
                select crimes;
    //  this query could also be written as
    //  IEnumerable<CityCrime> query = context.CityCrime.Where(crime => crime.City == "Newport").OrderBy(crime => crime.Year);
    
    
  5. Main() 内に CrimeData クラスと GetCrimeData() メソッドを使用するコードを記述し、データを使用して表示します。

    
    using System.Net;
    using USCrime2006and2007.DataGovCrimes; // using ApplicationName.ServiceReferenceName
    
    namespace USCrime2006and2007
    {
       class Program
       {
          public static void Main(string[] args)
          {
              IList<CityCrime> crimeList;  // CityCrime is the entity type returned by the service
              CrimeData crimeData = new CrimeData();
    
              crimeList = crimeData.GetCrimeData();
    
              if (crimeList != null)
              {
                  Console.WriteLine("{0,4} {1,-12} {2,-15} {3,10} {4,13}","Year",
                                                                          "City",
                                                                          "State",
                                                                          "Population",
                                                                          "Violent Crime");
    
                  foreach (CityCrime c in crimeList)
                  {
                      Console.WriteLine("{0,4} {1,-12} {2,-15} {3,10} {4,13}", c.Year, 
                                                                               c.City, 
                                                                               c.State, 
                                                                               c.Population,
                                                                               c.ViolentCrime);
                  } // end foreach
    
              }  // end if
    
              Console.Write("Tap any key to exit. ");
              Console.ReadKey();
    
          }  // end Main
    
        }  // end class Program
    
    }  // end namespace
    
    


using System.Net;
using USCrime2006and2007.DataGovCrimes; // using ApplicationName.ServiceReferenceName

namespace USCrime2006and2007
{
   class Program
   {
      public static void Main(string[] args)
      {
          IList<CityCrime> crimeList;  // CityCrime is the entity type returned by the service
          CrimeData crimeData = new CrimeData();

          crimeList = crimeData.GetCrimeData();

          if (crimeList != null)
          {
              Console.WriteLine("{0,4} {1,-12} {2,-15} {3,10} {4,13}","Year",
                                                                      "City",
                                                                      "State",
                                                                      "Population",
                                                                      "Violent Crime");

              foreach (CityCrime c in crimeList)
              {
                  Console.WriteLine("{0,4} {1,-12} {2,-15} {3,10} {4,13}", c.Year, 
                                                                           c.City, 
                                                                           c.State, 
                                                                           c.Population,
                                                                           c.ViolentCrime);
              } // end foreach

          }  // end if

          Console.Write("Tap any key to exit. ");
          Console.ReadKey();

      }  // end Main

    }  // end class Program

    class CrimeData
    {
        private Uri serviceUri;
        private datagovCrimesContainer context;

        // constructor for the CrimeData class
        public CrimeData()
        {
            serviceUri = new Uri(SERVICE_ROOT_URL);
            context = new datagovCrimesContainer(serviceUri);
            context.IgnoreMissingProperties = true;
            context.Credentials = new NetworkCredential USER_ID,
                                                        SECURE_ACCOUNT_KEY); // Your Marketplace account key
        }  // end constructor
 
        // – public function that returns a list of crime data
        public IList<CityCrime> GetCrimeData()
        {
            IEnumerable<CityCrime> query = context.CityCrime.Where(crime => crime.City == "Newport").OrderBy(crime => crime.Year);
 
            try
            {
                return query.ToList();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: {0}", ex.Message);
                return null;
            }  // end try

        }  // end function

    }  // end class CrimeData

}  // end namespace

コードを記述する際、データセットのメタデータが Intellisense に提供されます。使用する IDE が Intellisense をサポートしていない場合や、Intellisense が動作しない場合は、サービスからメタデータを取得できます。

  1. データセットのサービス ルート URL を取得します。
    サービス ルート URL を取得する方法については、上記の「サービス ルートの URL を取得する」を参照してください。

  2. サービス ルート URL の末尾に /$metadata を追加します。
    たとえば、サービス ルート URL が https://api.datamarket.azure.com/Data.ashx/fabrikam.com/inventory である場合、メタデータ URL は、https://api. datamarket.azure.com/Data.ashx/fabrikam.com/inventory/$metadata です。

  3. ブラウザーでメタデータ URL に移動します。

  4. メタデータを解析します。
    次のメタデータは、2006 - 2008 Crime in the United States データセット (https://api.datamarket.azure.com/Data.ashx/data.gov/Crimes/$metadata) に対応しています。

    
    <?xml version="1.0" encoding="utf-8" standalone="yes" ?> 
    <edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" xmlns:dr="http://schemas.microsoft.com/dallas/2010/04">   
       <edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="1.0">      
          <Schema Namespace="data.gov.Crimes"xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"
                  xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"
                  xmlns="http://schemas.microsoft.com/ado/2007/05/edm">
             <EntityType Name="CityCrime">
                <Key>
                   <PropertyRef Name="ROWID" />
                </Key>
                <Property Name="ROWID" Type="Edm.Int32" Nullable="false" dr:Queryable="true" dr:Returned="true" />
                <Property Name="State" Type="Edm.String" Nullable="true" dr:Queryable="true" dr:Returned="true" />
                <Property Name="City" Type="Edm.String" Nullable="true" dr:Queryable="true" dr:Returned="true" />
                <Property Name="Year" Type="Edm.Int32" Nullable="false" dr:Queryable="true" dr:Returned="true" />
                <Property Name="Population" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="ViolentCrime" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="MurderAndNonEgligentManslaughter" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="ForcibleRape" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="Robbery" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="AggravatedAssault" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="PropertyCrime" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="Burglary" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="LarcenyTheft" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="MotorVehicleTheft" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
                <Property Name="Arson" Type="Edm.Int32" Nullable="false" dr:Queryable="false" dr:Returned="true" />
             </EntityType>
             <EntityContainer Name="datagovCrimesContainer" m:IsDefaultEntityContainer="true">
                <EntitySet Name="CityCrime" EntityType="data.gov.Crimes.CityCrime" />
             </EntityContainer>
          </Schema>
       </edmx:DataServices>
    </edmx:Edmx>
    
    

    コード例 1 - メタデータ XML

    スキーマから多数の有用な情報を取得することができます。

    • エンティティ コンテナーの名前。
      <EntityContainer Name="datagovCrimesContainer" m:IsDefaultEntityContainer="true">
      これは、サービスへのアクセスを認証するのに使用するプライベートな context 識別子の型です。


    • エンティティ セットの名前と型。
      <EntitySet Name="CityCrime" EntityType="data.gov.Crimes.CityCrime" />
      これは、IEnumerable<T> および IList<T> の型です。


    • エンティティと型。
      <EntityType Name="CityCrime">
      これは、クエリおよび foreach (For Each) ループ変数で使用される型です。


    • クエリによって返される各フィールドの名前。
      Name=”State”


    • 各フィールドのデータ型。
      Type=”Edm.String”


    • フィールドを null にすることができるかどうか。
      Nullable=”false”


    • フィールドを使用してクエリ結果をフィルター処理できるかどうか。
      dr:Queryable=”true”
      dr:Queryable="false"
      クエリ可能なフィールドは、クエリの where (Where) 句で使用できます。クエリできないフィールドは、クエリの where (Where) 句で使用できません。


    • データセットのクエリでこのフィールドが返されるかどうか。
      dr:Returned=”true”

表示:
© 2015 Microsoft