C#でフレキシブルクエリデータを使用する
まず、自由に抽出条件を指定できるデータから説明していきます。
準備
前回同様に「2006 - 2008 Crime in the United States (Data.gov)」のデータを使用していきます。DataMarketのトップ画面から[My Data]をクリックして、[My Data]画面を表示してください。[2006 - 2008 Crime in the United States (Data.gov)]をクリックして表示された画面で[Details]をクリックして画面を表示してください。
画面の上部に「Service root URL」が表示されているので、表示されたURLをメモしておいてください。また、前回同様アカウントキーが必要となるので[My Data]→[Account Keys]で表示されたアカウントキーをメモしておいてください。
ソリューション作成
折角なのでAzureになぞらえてWindows Azureプロジェクトを使用して開発を行います。もちろん通常のASP.NETやコンソールアプリケーションなどでも、インターネットに接続している環境であれば、データを取得するアプリケーションは開発可能なので、それぞれの環境に合うように開発してください。
まず、Windows Azureプロジェクトのテンプレートを使用してソリューションを作成してください。ソリューション名を「AzureDataMarketTest」とします。ロールはASP.NET Webロールを使用します。今回はロール名を「DataMarket」と指定します。
サービス参照の追加
サービス参照を追加して、プロキシクラスを作成します。ソリューションエクスプローラーの[参照設定]を右クリックして、[サービス参照の追加]をクリックします。
アドレス欄に「Service root URL」で表示されたURLを入力して[移動]をクリックしてください。サービスが見つかると思います。なお、[操作]には表示されませんが問題ありません。[名前空間]に「DataGovCrimes」を入力して[OK]をクリックしてください。以下のように[Service References]に「DataGovCrimes」が追加されて表示されます。

コンテキストの作成
データを操作するクラスを実装するためのソースコードとして、新規に「DataMarketContext.cs」を作成して以下のコードを実装します。
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Net;
using DataMarket.DataGovCrimes;
namespace DataMarket
{
[DataObject]
public class CrimeDataContext
{
private string YOURLIVEID = "";
private string YOURACCOUNTKEY = "";
private static Uri serviceURI;
private static datagovCrimesContainer context;
public CrimeDataContext()
{
serviceURI = new Uri("https://api.datamarket.azure.com/Data.ashx/data.gov/Crimes/");
context = new datagovCrimesContainer(serviceURI);
context.Credentials = new NetworkCredential(
YOURLIVEID,
YOURACCOUNTKEY);
}
[DataObjectMethod(DataObjectMethodType.Select)]
public IEnumerable<CityCrime> GetCrimeData(string state, string city)
{
return (from crimes in context.CityCrime
where crimes.State == state && crimes.City == city
orderby crimes.Year ascending
select crimes);
}
}
}
このコードでは、CrimeDataクラス内のコンストラクタでコンテキストを定義しています。参照先を定義しているserviceURIでは「Service root URL」で表示されたURLを設定します。認証情報を定義するNetworkCredentialクラスでは、それぞれの環境に合わせて、第1引数にDataMarketに登録しているLiveIDに、第2引数にアカウントキーを設定してください。
フォーム画面の作成
次に、データの入力・表示を行うフォーム画面(DataGovCrimeData.aspx)を作成します。今回は州名と都市名を元に検索を行うため、2つの入力項目の入力を行うテキストボックス、検索結果を表示するGridView、データバインドのためのObjectDataSource、検索を行うためのボタンを配置します。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DataGovCrimeData.aspx.cs" Inherits="DataMarket.DataGovCrimeData" %>
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>DataMarket CrimeData</title>
</head>
<body>
<form id="form1" runat="server">
<h1>Crimeデータのリスト</h1>
<dl>
<dt>State</dt>
<dd><asp:TextBox ID="StateTextBox"
runat="server" >Texas</asp:TextBox>
</dd>
<dt>City</dt>
<dd><asp:TextBox ID="CityTextBox"
runat="server" >Dallas</asp:TextBox>
</dd>
</dl>
<asp:Button ID="GetDataButton" runat="server" Text="検索" />
<br />
<br />
<asp:ObjectDataSource ID="CrimeData" runat="server"
TypeName="DataMarket.CrimeDataContext"
SelectMethod="GetCrimeData" OldValuesParameterFormatString="original_{0}">
<SelectParameters>
<asp:ControlParameter
Name="state"
ControlID="StateTextBox" PropertyName="Text"
Type="String" DefaultValue="Texas" />
<asp:ControlParameter ControlID="CityTextBox" Name="city"
PropertyName="Text" Type="String" DefaultValue="Dallas" />
</SelectParameters>
</asp:ObjectDataSource>
<asp:GridView ID="CrimeDataGridView" runat="server" AutoGenerateColumns="False" DataSourceID="CrimeData">
<Columns>
<asp:BoundField DataField="State" HeaderText="State" SortExpression="State" />
<asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
<asp:BoundField DataField="Year" HeaderText="Year"
SortExpression="Year" />
<asp:BoundField DataField="Population" HeaderText="Population"
SortExpression="Population" />
<asp:BoundField DataField="ViolentCrime" HeaderText="ViolentCrime"
SortExpression="ViolentCrime" />
</Columns>
</asp:GridView>
</form>
</body>
</html>
今回は画面レイアウトの都合上、犯罪情報はViolentCrime(暴力犯罪)のみを表示しますが、他の項目もすべて取得済みなので容易に表示できます。
きちんとDataMarketから受け取ったデータを表示できたでしょうか。後はこのWebアプリケーションをAzureのコンピュートサービスにデプロイすることで簡単に公開できます。


![[サービス参照の追加]の画面](http://cz-cdn.shoeisha.jp/static/images/article/5763/5763_fig3.gif)
