|
|
51CTO旗下网站
|
|
移动端

3.2.4.3 开发应用

《Microsoft Azure 管理与开发(下册)平台服务PaaS》本书由世纪互联蓝云Microsoft Azure 开发技术支持团队的资深工程师们编写,主要阐述MicrosoftAzure PaaS 服务的开发应用,涉及计算服务、集成认证服务、数据存储服务、大数据服务等方面的内容。本节为大家介绍开发应用。

作者:世纪互联蓝云公司来源:电子工业出版社|2018-07-13 11:01

3.2.4.3 开发应用

本文使用.NET 存储客户端构建应用示例,涉及的内容包括客户端连接、插入一条实体、批量插入实体、检索分区中所有实体、检索分区中部分实体、检索单个实体、投影查询、更新实体、插入或更新实体、删除实体、删除表。

1. 客户端连接

客户端API 提供了丰富的接口,连接方式也有多种方法,常用的连接操作示例如下:

  1. CloudStorageAccount storageAccount = CloudStorageAccount.Parse(  
  2. CloudConfigurationManager.GetSetting("connection string"));  
  3. CloudTableClient tableClient = storageAccount.CreateCloudTableClient(); 

2. 插入一条实体

实体使用派生自 TableEntity 的自定义类映射到对象。若要将实体添加到表,请创建用于定义实体的属性的类。以下实体将名字和姓氏分别用作行键和分区键的实体类。

  1. public class CustomerEntity : TableEntity  
  2. {  
  3. public CustomerEntity(string lastName, string firstName)  
  4. {  
  5. this.PartitionKey = lastName;  
  6. this.RowKey = firstName;  
  7. }  
  8. public CustomerEntity() { }  
  9. public string Email { get; set; }  
  10. public string PhoneNumber { get; set; }  

以下代码示例演示了如何创建CloudTable 对象以及CustomerEntity 对象。为准备此操作,会创建一个TableOperation 对象以将客户实体插入该表中。最后,通过调用CloudTable.Execute 执行此操作。

  1. CloudTable table = tableClient.GetTableReference("people");  
  2. table. CreateIfNotExists();  
  3. CustomerEntity customer = new CustomerEntity("Zhang", "3");  
  4. customer.Email = "zhang3@contoso.com";  
  5. customer.PhoneNumber = "425-555-0101";  
  6. TableOperation insertOperation = TableOperation.Insert(customer);  
  7. table.Execute(insertOperation); 

3. 批量插入实体

可以通过一次写入操作将一批实体插入表中。批处理操作的一些注意事项:

可以在同一批处理操作中执行更新、删除和插入操作;

单个批处理操作最多可包含100 个实体;

单次批处理操作中的所有实体都必须具有相同的分区键。

创建两个实体对象,并使用Insert 方法将其中每个对象都添加到TableBatchOperation中,然后调用CloudTable.ExecuteBatch 以执行此操作。以下代码示例为:

  1. CloudTable table = tableClient.GetTableReference("people");  
  2. CustomerEntity customer1 = new CustomerEntity("Zhang", "3");  
  3. customer1.Email = "zhang3@contoso.com";  
  4. customer1.PhoneNumber = "425-555-0101";  
  5. CustomerEntity customer2 = new CustomerEntity("Li", "4");  
  6. customer2.Email = "li4@contoso.com";  
  7. customer2.PhoneNumber = "425-555-0102";  
  8. TableBatchOperation batchOperation = new TableBatchOperation();  
  9. batchOperation.Insert(customer1);  
  10. batchOperation.Insert(customer2);  
  11. table.ExecuteBatch(batchOperation); 

4. 检索分区中所有实体

若要查询表以获取分区中的所有实体,需要使用 TableQuery 对象。以下代码示例为,指定了一个筛选器,以筛选分区键为“Zhang”的实体:

  1. CloudTable table = tableClient.GetTableReference("people");  
  2. TableQuery<CustomerEntity> query = new 
  3. TableQuery<CustomerEntity>().Where(TableQuery.GenerateFilterCondition  
  4. ("PartitionKey", QueryComparisons.Equal, "Zhang"));  
  5. foreach (CustomerEntity entity in table.ExecuteQuery(query))  
  6. {  
  7. Console.WriteLine( " {0}, {1}\t{2}\t{3} " , entity.PartitionKey,  
  8. entity.RowKey,  
  9. entity.Email, entity.PhoneNumber);  

5. 检索分区中部分实体

如果不想查询分区中的所有实体,则可以通过结合使用分区键筛选器与行键筛选器来指定一个范围。使用两个筛选器来获取分区“Zhang”中的、行键(名字)以字母“S”前面的字母开头的所有实体,然后输出查询结果。代码示例为:

  1. CloudTable table = tableClient.GetTableReference("people");  
  2. TableQuery<CustomerEntity> rangeQuery = new TableQuery<CustomerEntity>().  
  3. Where(  
  4. TableQuery.CombineFilters(  
  5. TableQuery.GenerateFilterCondition("PartitionKey",  
  6. QueryComparisons.Equal, "Zhang"),  
  7. TableOperators.And,  
  8. TableQuery.GenerateFilterCondition("RowKey",  
  9. QueryComparisons.LessThan, "S")));  
  10. foreach (CustomerEntity entity in table.ExecuteQuery(rangeQuery))  
  11. {  
  12. Console.WriteLine("{0}, {1}\t{2}\t{3}", entity.PartitionKey, entity.  
  13. RowKey,  
  14. entity.Email, entity.PhoneNumber);  

6. 检索单个实体

可以编写查询以检索单个特定实体。以下代码示例,使用TableOperation 来指定客户“Zhang 3”。此方法仅返回一个实体,而不是一个集合,并且TableResult.Result 中的返回值是一个 CustomerEntity 对象。在查询中指定分区键和行键是从表服务中检索单个实体的最快方法。

  1. CloudTable table = tableClient.GetTableReference("people");  
  2. TableOperation retrieveOperation = TableOperation.Retrieve <CustomerEntity>(  
  3. "Zhang", "3");  
  4. TableResult retrievedResult = table.Execute(retrieveOperation);  
  5. if (retrievedResult.Result != null)  
  6. {  
  7. Console.WriteLine(((CustomerEntity)retrievedResult.Result).PhoneNumbe  
  8. r);  
  9. }  
  10. else  
  11. {  
  12. Console.WriteLine("The phone number could not be retrieved.");  

7. 投影查询

表查询可以只检索实体中的少数几个属性而不是所有实体属性。此方法称为“投影”,可减少带宽并提高查询性能,尤其适用于大型实体。以下代码中的查询只返回表中实体的电子邮件地址。这可通过使用 ynamicTableEntity 和EntityResolver 的查询来实现。

  1. CloudTable table = tableClient.GetTableReference("people");  
  2. TableQuery<DynamicTableEntity> projectionQuery = new 
  3. TableQuery<DynamicTableEntity>().Select(new string[] { "Email" });  
  4. EntityResolver<string> resolver = (pk, rk, ts, props, etag) => props.ContainsKey  
  5. ("Email") ?  
  6. props["Email"].StringValue : null;  
  7. foreach (string projectedEmail in table.ExecuteQuery(projectionQuery,  
  8. resolver, null, null))  
  9. {  
  10. Console.WriteLine(projectedEmail);  

8. 更新实体

若要更新实体,请从表服务中检索它,修改实体对象,然后将更改保存回表服务。代码示例如下:

  1. CloudTable table = tableClient.GetTableReference("people");  
  2. TableOperation retrieveOperation = TableOperation.Retrieve<CustomerEntity> 
  3. ("Zhang", "3");  
  4. TableResult retrievedResult = table.Execute(retrieveOperation);  
  5. CustomerEntity updateEntity = (CustomerEntity)retrievedResult.Result;  
  6. if (updateEntity != null)  
  7. {  
  8. updateEntity.PhoneNumber = "425-555-0105";  
  9. TableOperation updateOperation = TableOperation.Replace(updateEntity);  
  10. table.Execute(updateOperation);  
  11. Console.WriteLine("Entity updated.");  
  12. }  
  13. else  
  14. {  
  15. Console.WriteLine("Entity could not be retrieved.");  

9. 插入或更新实体

如果该实体不存在,此操作将插入实体。代码示例如下:

  1. CloudTable table = tableClient.GetTableReference("people");  
  2. CustomerEntity customer = new CustomerEntity("Wang", "5");  
  3. customer.Email = "wang5@contoso.com";  
  4. customer.PhoneNumber = "425-555-0106";  
  5. TableOperation insertOrReplaceOperation = TableOperation.InsertOrReplace  
  6. (customer);  
  7. table.Execute(insertOrReplaceOperation); 

10. 删除实体

在检索实体之后,可使用更新实体的相同演示模式轻松删除该实体。示例代码如下:

  1. CloudTable table = tableClient.GetTableReference("people");  
  2. TableOperation retrieveOperation = TableOperation.Retrieve  
  3. <CustomerEntity>(  
  4. "Smith", "Ben");  
  5. TableResult retrievedResult = table.Execute(retrieveOperation);  
  6. CustomerEntity deleteEntity = (CustomerEntity)retrievedResult.Result;  
  7. if (deleteEntity != null)  
  8. {  
  9. TableOperation deleteOperation = TableOperation.Delete(deleteEntity);  
  10. table.Execute(deleteOperation);  
  11. Console.WriteLine("Entity deleted.");  
  12. }  
  13. else  
  14. {  
  15. Console.WriteLine("Could not retrieve the entity.");  

11. 删除表

在删除表之后的一段时间内,可能无法立即创建同名的表。代码示例如下:

  1. CloudTable table = tableClient.GetTableReference("people");  
  2. table.DeleteIfExists(); 


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

软件工程:实践者的研究方法

20多年以来,《软件工程:实践者的研究方法》一书是最受学生和行业专业人员欢迎的软件工程指南。它在全面而系统、概括而清晰地介绍软件工程...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊