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

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

更新日: 2014年2月

 

 

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 メタデータの例。

  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)、使用するデータ サービスへのサービス参照を追加します。

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

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

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

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

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

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

  7. [サービス ルート 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 プロパティは、サーバーで型に追加されたプロパティに対するクライアントの堅牢性を高めるために設定します (詳細については、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# プログラミング ガイド) (LINQ (Visual Basic)) を参照してください。
    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”

表示:
© 2014 Microsoft