一,引言

  上一篇文章我们在.NET 项目中添加了 “WindowsAzure.Storage” 的 NuGet 包进行操作Table 数据,但是使用的 “WindowsAzure.Storage”  NeGet 以及没微遗弃了,所以我们今天继续讲 Azure Table Storage,使用新的 Nuget  包--- “Microsoft.Azure.Cosmos.Table” 来操作 Table 数据。

nuget 链接:https://www.nuget.org/packages/Microsoft.Azure.Cosmos.Table

我们可以看到 当前neget 包 允许使用 Microsoft Azure CosmosDB 表 API 以及 Azure 表存储。

--------------------我是分割线--------------------

Azure Storage 存储系列:

1,Azure Storage 系列(一)入门简介

2,Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

3,Azure Storage 系列(三)Blob 参数设置说明

4,Azure Storage 系列(四)在.Net 上使用Table Storage

5,Azure Storage 系列(五)通过Azure.Cosmos.Table 类库在.Net 上使用 Table Storage

二,正文

1,安装 “Microsoft.Azure.Cosmos.Table” 的 NuGet

使用程序包管理控制台进行安装

Install-Package Microsoft.Azure.Cosmos.Table -Version 1.0.8

2,创建ITableServiceV2 接口,和 TableServiceV2 实现类,控制器方法等

  因为使用的 “Microsoft.Azure.Cosmos.Table” 的Nuget 和 “WindowsAzure.Storage” Nuget 中对 Table Storage 的操作中使用的方法,以及类都是一样的,只是命名空间不一样,所以代码上差别不太大。所以大家可以看一下具体代码和已遗弃的方法进行对比。

完整代码:

 public interface ITableServiceV2
{
/// <summary>
/// AddEntity(abandoned)
/// </summary>
/// <param name="user">user</param>
/// <returns></returns>
Task AddEntity(UserInfoV2 user); /// <summary>
/// BatchAddEntities(abandoned)
/// </summary>
/// <param name="users">users</param>
/// <returns></returns>
Task BatchAddEntities(List<UserInfoV2> users); /// <summary>
/// QueryUsers(abandoned)
/// </summary>
/// <param name="filter">filter</param>
/// <returns></returns>
IEnumerable<UserInfoV2> QueryUsers(string filter); /// <summary>
/// UpdateEntity(abandoned)
/// </summary>
/// <param name="user">user</param>
/// <returns></returns>
Task UpdateEntity(UserInfoV2 user); /// <summary>
/// DeleteEntity(abandoned)
/// </summary>
/// <param name="user">user</param>
/// <returns></returns>
Task DeleteEntity(UserInfoV2 user); /// <summary>
/// DeleteTable(abandoned)
/// </summary>
/// <param name="tableName">tableName</param>
/// <returns></returns>
Task DeleteTable(string tableName);
}

ITableServiceV2.cs

 public class TableServiceV2 : ITableServiceV2
{
private readonly CloudStorageAccount _cloudStorageClient;
public TableServiceV2(CloudStorageAccount cloudStorageClient)
{
_cloudStorageClient = cloudStorageClient;
} #region 01,添加表数据+async Task AddEntity(UserInfo user)
/// <summary>
/// 添加表数据
/// </summary>
/// <param name="user">用户数据</param>
/// <returns></returns>
public async Task AddEntity(UserInfoV2 user)
{
var cloudTableClient = _cloudStorageClient.CreateCloudTableClient();
var cloudTable = cloudTableClient.GetTableReference("USERINFOV2");
await cloudTable.CreateIfNotExistsAsync(); var tableOperation = TableOperation.Insert(user);
await cloudTable.ExecuteAsync(tableOperation);
}
#endregion public async Task BatchAddEntities(List<UserInfoV2> users)
{
var cloudTableClient = _cloudStorageClient.CreateCloudTableClient();
var cloudTable = cloudTableClient.GetTableReference("USERINFOV2");
await cloudTable.CreateIfNotExistsAsync(); var tableBatchOperation = new TableBatchOperation();
foreach (UserInfoV2 item in users)
{
tableBatchOperation.Insert(item);
} await cloudTable.ExecuteBatchAsync(tableBatchOperation);
} public async Task DeleteEntity(UserInfoV2 user)
{
var cloudTableClient = _cloudStorageClient.CreateCloudTableClient();
var cloudTable = cloudTableClient.GetTableReference("USERINFOV2"); var queryOperation = TableOperation.Retrieve<UserInfoV2>(user.PartitionKey, user.RowKey); var tableResult = await cloudTable.ExecuteAsync(queryOperation);
if (tableResult.Result is UserInfoV2 userInfo)
{
var deleteOperation = TableOperation.Delete(userInfo);
await cloudTable.ExecuteAsync(deleteOperation);
}
} public async Task DeleteTable(string tableName)
{
var cloudTableClient = _cloudStorageClient.CreateCloudTableClient();
var cloudTable = cloudTableClient.GetTableReference(tableName);
await cloudTable.DeleteIfExistsAsync();
} public IEnumerable<UserInfoV2> QueryUsers(string filter)
{
var cloudTableClient = _cloudStorageClient.CreateCloudTableClient();
var cloudTable = cloudTableClient.GetTableReference("USERINFOV2"); TableQuery<UserInfoV2> query = new TableQuery<UserInfoV2>().Where(filter); var users = cloudTable.ExecuteQuery(query);
foreach (var item in users)
{
yield return item;
}
} public async Task UpdateEntity(UserInfoV2 user)
{
var cloudTableClient = _cloudStorageClient.CreateCloudTableClient();
var cloudTable = cloudTableClient.GetTableReference("USERINFOV2"); var queryOperation = TableOperation.Retrieve<UserInfoV2>(user.PartitionKey, user.RowKey); var tableResult = await cloudTable.ExecuteAsync(queryOperation);
if (tableResult.Result is UserInfoV2 userInfo)
{
user.ETag = userInfo.ETag;
var deleteOperation = TableOperation.Replace(user);
await cloudTable.ExecuteAsync(deleteOperation);
}
}
}

TableServiceV2.cs

 [Route("TableV2")]
public class TableExplorerV2Controller : Controller
{
private readonly ITableServiceV2 _tableService; public TableExplorerV2Controller(ITableServiceV2 tableService)
{
this._tableService = tableService;
} [HttpPost("AddUser")]
public async Task<ActionResult> AddEntity([FromBody] UserInfoV2 user)
{
await _tableService.AddEntity(new UserInfoV2("huge", "") { Email = "huge@qq.com", TelNum = "" });
return Ok();
} [HttpPost("AddBatchUser")]
public async Task<ActionResult> AddEntities([FromBody] List<UserInfoV2> users)
{
List<UserInfoV2> userList = new List<UserInfoV2>();
userList.Add(new UserInfoV2("wangwei", "") { Email = "wangwei@qq.com", TelNum = "" });
userList.Add(new UserInfoV2("wangwei", "") { Email = "wangwei@qq.com", TelNum = "" });
userList.Add(new UserInfoV2("wangwei", "") { Email = "wangwei@qq.com", TelNum = "" });
await _tableService.BatchAddEntities(userList);
return Ok();
} [HttpGet("Users")]
public ActionResult QueryUsers()
{
var filter = TableQuery.CombineFilters(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, "wangwei"), TableOperators.And, TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.Equal, "")); return Ok(_tableService.QueryUsers(filter));
} [HttpPut("UpdateUser")]
public async Task<ActionResult> UpdateUser([FromBody] UserInfoV2 user)
{
await _tableService.UpdateEntity(new UserInfoV2("huge", "") { Email = "huge@163.com", TelNum = "" });
return Ok();
} [HttpDelete("DeleteEntity")]
public async Task<ActionResult> DeleteEntity([FromBody] UserInfoV2 user)
{
await _tableService.DeleteEntity(new UserInfoV2("wangwei", ""));
return Ok();
} [HttpDelete("{tableName}")]
public async Task<ActionResult> DeleteTable(string tableName)
{
await _tableService.DeleteTable(tableName);
return Ok();
}
}

TableExplorerV2Controller.cs

3,添加对 TableServiceV2 ,CloudStorageAccount 的注入

services.AddSingleton(x => new Microsoft.Azure.Cosmos.Table.CloudStorageAccount(new Microsoft.Azure.Cosmos.Table.StorageCredentials("cnbateblogaccount", "FU01h022mn1JjONp+ta0DAXOO7ThK3diYhd4xrm0Hpg891n9nycsTLGZXXXXnJpGvTIZvO5VCVFhGOfV0wndOOQ=="), true));
services.AddSingleton<ITableServiceV2, TableServiceV2>();

4,测试使用新的 Nuget 包中的方法是否能正常操作 Table 表数据

添加用户数据,我们在 postman 中调用添加用户表数据接口

我们可以看到,在Azure Portal 上已经创建出一个叫 “USERINFOV2” 的表信息(注意,大家不要疑惑,可以看看上面添加用户的Service方法,我这里有两行代码)

var cloudTable = cloudTableClient.GetTableReference("USERINFOV2");
await cloudTable.CreateIfNotExistsAsync();

接下来我们在Cloud Explorer 查看 “USERINFOV2” Table 的表信息

查询用户数据,我这里还是使用两个查询条件联合进行查询,分别是 “PartitionKey” 和 “RowKey” 作为查询的 Key,通过 “Partition” 等于 “wangwei” 和 “RowKey” 等于 “610124199012221001”

注意(我提前已经将调用了批量添加用户的接口,将 PartitionKey 等于 "wangwu" 的三条数据添加到 Table 中了)

OK,剩余的更新,删除就不再演示了,大家可以自行进行校验,今天的分享内容到此结束。

三,结尾

github:https://github.com/yunqian44/Azure.Storage.git

作者:Allen

版权:转载请在文章明显位置注明作者及出处。如发现错误,欢迎批评指正。

Azure Storage 系列(五)通过Azure.Cosmos.Table 类库在.Net 上使用 Table Storage的更多相关文章

  1. Windows Azure 入门系列课程Windows Azure 入门系列课程

    Windows Azure 入门系列课程 https://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/NewSeries/A ...

  2. Azure Devops(十五) 使用Azure的私有Maven仓库

    上一篇文章中,我们介绍了如何使用Azure的nuget仓库,今天我们来研究一下如何使用azure给我们提供的maven仓库. 首先,我们打开azureDevops,点击到制品界面,然后选择maven. ...

  3. Azure Storage 系列(六)使用Azure Queue Storage

    一,引言 在之前介绍到 Azure Storage 第一篇文章中就有介绍到 Azure Storage 是 Azure 上提供的一项存储服务,Azure 存储包括 对象.文件.磁盘.队列和表存储.这里 ...

  4. Azure Storage 系列(七)使用Azure File Storage

    一,引言 今天我们开始介绍 Storage 中的最后一个类型的存储----- File Storage(文件存储),Azure File Storage 在云端提供完全托管的文件共享,这些共享项可通过 ...

  5. Windows Azure Platform 系列文章目录

    Windows Azure Platform (一) 云计算的出现 Windows Azure Platform (二) 云计算的分类和服务层次 Windows Azure Platform (三) ...

  6. Azure Terraform(五)利用Azure DevOps 实现自动化部署基础资源

    一,引言 上一篇我们结合学习 Azure Traffic Manger 的内容,做了一个负载均衡的基础设施架构.通过 Terraform 部署执行计划,将整个 Azure Traffic Manage ...

  7. [New Portal]Windows Azure Virtual Machine (15) 在本地制作数据文件VHD并上传至Azure(2)

    <Windows Azure Platform 系列文章目录> 在上一章内容里,我们已经将包含有OFFICE2013 ISO安装文件的VHD上传至Azure Blob Storage中了. ...

  8. Azure Storage 系列(四)在.Net 上使用Table Storage

    一,引言 今天我们就不多说废话了,直接进入正题,Azure Table Storage.开始内容之前,我们先介绍一下Azure Table Storage. 1,什么是Azure Table Stor ...

  9. Windows Azure入门教学系列 (五):使用Queue Storage

    本文是Windows Azure入门教学的第五篇文章. 本文将会介绍如何使用Queue Storage.Queue Storage提供给我们一个云端的队列.我们可以用Queue Storage来进行进 ...

随机推荐

  1. 代码优化实战,3行代码解决了一百个if else!

    事情是这样的,前段时间做代码review的时候,发现项目中有一个方法代码量超鸡儿多,而且大部分都是写的参数校验的代码,得,我们先抓着缕一缕需求先. 产品需求 找到产品要到了需求文档,需求是这样得: e ...

  2. 使用Axure设计基于中继器的左侧导航菜单

    实现效果: 使用组件: 设计详解: 一.设计外层菜单 1.拖一个矩形,在属性栏中命名cd1,设置宽高为200*45,背景色#393D49,双击设置按钮名称为“默认展开”,字体大小16,字体颜色#C2C ...

  3. Salesforce学习笔记之Actions and Recommendations

    设置Actions and Recommendations(Salesforce提供的标准元素),Salesforce上的文档说有两种方法,即Deployment和Process Builder(通过 ...

  4. 企业项目实战 .Net Core + Vue/Angular 分库分表日志系统 | 简单的分库分表设计

    前言 项目涉及到了一些设计模式,如果你看的不是很明白,没有关系坚持下来,写完之后去思考去品,你就会有一种突拨开云雾的感觉,所以请不要在半途感觉自己看不懂选择放弃,如果我哪里写的详细,或者需要修正请联系 ...

  5. unity探索者之protobuf的序列化和反序列化导致unity崩溃的问题研究

    版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7574569.html 这两天博主在接微信支付SDK的时候碰到一个非常恶心又诡异的问 ...

  6. Cinder Volume 服务启动流程分析和周期性任务分析

    1.cinder-volume服务的程序入口 #!/usr/bin/python2 # PBR Generated from u'console_scripts' import sys from ci ...

  7. python列表的索引与切片

    <1>.python的列表 索引方式: 例如,list1 = ['张三','男','33','江苏','硕士','已婚',['身高178','体重72']] 1.正向单索引 print(l ...

  8. Windows Server 2012 R2 时间同步

    最近的项目两台服务器都是Windows Server 2012的系统,需要做时间同步,现在是一些从网上搜罗的步骤总结. 具体就是配置windows的注册表: 一.服务端配置 (NTP服务器,客户端将根 ...

  9. 认证授权:学习OIDC

    前言 上一篇文章介绍了OAuth2.0协议的相关内容,知道OAuth2.0是一个授权协议,无法提供完善的身份认证功能.那么什么来解决身份认证功能呢?——OIDC是一个不错的解决方案.接下来进一步来了解 ...

  10. 力扣Leetcode 55. 跳跃游戏

    跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: ...