你当前正在访问 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 进行查询
现在可继续学习下一教程,了解如何全局发布数据。