你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:使用 API for Table 查询 Azure Cosmos DB

适用于:

Azure Cosmos DB API for Table 支持对键/值(表)数据进行 OData 和 LINQ 查询。

本文涵盖以下任务:

  • 使用 API for Table 查询数据

本文中的查询使用如下示例 People 表:

PartitionKey RowKey 电子邮件 PhoneNumber
Harp Walter Walter@contoso.com 425-555-0101
Smith Ben Ben@contoso.com 425-555-0102
Smith Jeff Jeff@contoso.com 425-555-0104

有关如何使用 API for Table 执行查询的详细信息,请参阅查询表和实体

有关 Azure Cosmos DB 提供的高级功能的详细信息,请参阅 Azure Cosmos DB for Table 在 .NET 中使用 API for Table 进行开发

先决条件

若要使这些查询生效,必须拥有 Azure Cosmos DB 帐户,且容器中必须包含实体数据。 没有这些内容? 请学习五分钟快速入门,创建帐户并填充数据库。

根据 PartitionKey 和 RowKey 查询

由于 PartitionKey 和 RowKey 属性构成实体的主键,因此可以使用以下特殊语法来识别实体:

查询

https://<mytableendpoint>/People(PartitionKey='Harp',RowKey='Walter')  

结果

PartitionKey RowKey 电子邮件 PhoneNumber
Harp Walter Walter@contoso.com 425-555-0104

或者,可将这些属性指定为 $filter 选项的一部分,如以下部分中所示。 请注意,键属性名称和常量值区分大小写。 PartitionKey 和 RowKey 属性皆为 String 类型。

使用 OData 筛选器进行查询

构造筛选器字符串时,请记住以下规则:

  • 使用由 OData 协议规范定义的逻辑运算符比较属性和值。 请注意,不能将属性与动态值进行比较。 表达式的一侧必须是常量。
  • 必须使用 URL 编码空格分隔属性名称、运算符和常量值。 空格经 URL 编码后为 %20
  • 筛选器字符串的所有部分都区分大小写。
  • 常量值的数据类型必须与属性的类型相同,这样筛选器才能返回有效的结果。 有关支持的属性类型的详细信息,请参阅 Understanding the Table Service Data Model(了解表服务数据模型)。

以下示例查询演示如何使用 OData $filter 按 PartitionKey 和 Email 属性进行筛选。

查询

https://<mytableapi-endpoint>/People()?$filter=PartitionKey%20eq%20'Smith'%20and%20Email%20eq%20'Ben@contoso.com'

有关如何对不同数据类型构造筛选表达式的详细信息,请参阅 Querying Tables and Entities(查询表和实体)。

结果

PartitionKey RowKey 电子邮件 PhoneNumber
Smith Ben Ben@contoso.com 425-555-0102

在 Azure Cosmos DB 的 API for Table 中执行查询时,针对 datetime 属性的查询不返回任何数据。 虽然 Azure 表存储使用时钟周期的时间粒度存储日期值,但 Azure Cosmos DB 中的 API for Table 使用 _ts 属性。 _ts 属性处于第二个粒度级别,它不是 OData 筛选器。 因此,Azure Cosmos DB 阻止了有关 timestamp 属性的查询。 解决方法是,可以定义自定义日期/时间或长数据类型属性,并设置客户端的日期值。

使用 LINQ 进行查询

还可使用 LINQ 进行查询,这会转换为相应的 OData 查询表达式。 以下示例演示如何使用 .NET SDK 生成查询。

IQueryable<CustomerEntity> linqQuery = table.CreateQuery<CustomerEntity>()
            .Where(x => x.PartitionKey == "4")
            .Select(x => new CustomerEntity() { PartitionKey = x.PartitionKey, RowKey = x.RowKey, Email = x.Email });

后续步骤

在本教程中已完成以下操作:

  • 已了解如何使用 API for Table 进行查询

现在可继续学习下一教程,了解如何全局发布数据。