Создание приложения гибкого запроса

Обновлено: Февраль 2014 г.

 

Эмблема 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# и Visual Basic.

Метаданные

Пример метаданных 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. Нажмите кнопку ОК.

  6. Добавьте следующий код в начало файла Program.cs (Program.vb), используемого для аутентификации доступа к набору данных.

    using System.Net; // needed for authentication
    

После запуска Visual Studio с правами администратора и создания нового консольного приложения (шаг 1) добавьте ссылку на службу данных, которую требуется использовать.

  1. Перейдите на домашнюю страницу Marketplace.

  2. Перейдите на вкладку My Data ("Мои данные").

  3. Найдите службу данных 2006 - 2008 Crime in the United States ("Преступность в США за 2006–2008 гг").

  4. Щелкните Использовать справа от названия набора данных. Откроется страница сведений для этого набора данных.

  5. Прокрутите страницу вниз до вкладок под заголовком Learn How to Use this Data in Visual Studio ("Узнайте, как использовать эти данные в Visual Studio")

  6. Перейдите на вкладку Подробно.

  7. Найдите корневой URL-адрес службы.

    Корневой URL-адрес службы


    Рис. 1. Корневой URL-адрес службы

  8. Скопируйте корневой URL-адрес службы в буфер обмена.

  1. Вернитесь в проект Visual Studio.

  2. В обозревателе решений щелкните правой кнопкой мыши Ссылки.

  3. В раскрывающемся меню щелкните Добавить ссылку на службу....

  4. Вставьте корневой URL-адрес службы из буфера обмена в раскрывающийся список Адрес.

  5. Нажмите кнопку Переход.
    Подождите несколько секунд, чтобы в текстовом поле "Службы" отобразилась доступная для проекта служба.

  6. Введите понятное имя пространства имен в поле Пространство имен.
    Например: DataGovCrimes.

  7. Нажмите кнопку ОК.
    Имя ссылки на службу будет отображаться в разделе Ссылки на службы в обозревателе решений.

  1. Выберите Program.cs (Program.vb) в области кода Visual Studio.

  2. Добавьте следующий оператор, который делает ссылку на службу доступной для приложения.

    noteПримечание
    Используйте пространство имен программы и имя из пространства имен ссылок на службы, созданное в шаге 6 выше.

    using USCrime2006and2007.DataGovCrimes; // using ApplicationName.ServiceReferenceName
    

  1. Создайте общий класс CrimeData в пространстве имен проекта.

  2. Создайте две частные переменные внутри этого класса.

    • Идентификатор URI службы.

    • Контейнер службы, в котором хранятся учетные данные службы в контексте службы.

      1. Перейдите на страницу сведений.

      2. Щелкните Get Started with this Dataset ("Приступая к работе с этим набором данных").

      3. Откройте вкладку Overview ("Обзор").
        Отображаются имя набора сущностей и имя коллекции сущностей.

    
    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#) (LINQ в Visual Basic).
    Сведения об ограничениях запросов LINQ в Marketplace см. в разделе Поддерживаемые параметры запроса OData.

    В рамках Marketplace допустимы следующие запросы LINQ.

    
    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 по мере создания кода. Если интегрированная среда разработки не поддерживает Intellisense или Intellisense не работает, метаданные можно получить из службы.

  1. Получите коревой URL-адрес службы набора данных.
    См. инструкции по получению корневого URL-адреса службы в разделе Получение корневого URL-адреса службы.

  2. Добавьте /$metadata в конец корневого URL-адреса службы.
    Например, если корневой 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 ("Преступность в США за 2006–2008 гг.") 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”

Показ: