导出 (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”和“控制台应用程序”)。

  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)后,请添加要使用的数据服务的服务引用。

获取服务根 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. 单击“确定”。
    服务引用的名称将显示在“解决方案资源管理器”中的“服务引用”下面。

将服务引用添加到代码

  1. 在 Visual Studio 代码窗格中选择“Program.cs”(Program.vb)。

  2. 添加以下语句,使你的服务引用可供应用程序访问。

    note备注
    使用程序命名空间加上你在前面步骤 #6 中创建的服务引用命名空间名称。

    using USCrime2006and2007.DataGovCrimes; // using ApplicationName.ServiceReferenceName
    

创建一个类来执行操作

  1. 在项目命名空间中创建一个公共类 CrimeData

  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