如何在C#中获取Azure表存储中的所有行
本文关键字:存储 Azure 获取 | 更新日期: 2023-09-27 18:06:01
我正在尝试获取azure表中所有实体的列表。
你知道我该怎么写这个查询吗?
要回答您的问题,您可以执行以下操作:
var acc = new CloudStorageAccount(
new StorageCredentials("account name", "account key"), true);
var tableClient = acc.CreateCloudTableClient();
var table = tableClient.GetTableReference("table name");
var entities = table.ExecuteQuery(new TableQuery<MyEntity>()).ToList();
但是,请记住,表服务在一次调用中最多返回1000个实体。如果表中有1000多个实体可用,它会返回一个continuation token
,可用于获取下一组实体。ExecuteQuery
方法实际上在内部处理这个延续令牌,因此,如果您出于任何原因想要取消这个操作,都不能这样做。
更好的方法是使用ExecuteQuerySegmented
方法并让您的应用程序处理令牌。下面是这样做的示例代码:
var acc = new CloudStorageAccount(
new StorageCredentials("account name", "account key"), true);
var tableClient = acc.CreateCloudTableClient();
var table = tableClient.GetTableReference("table name");
TableContinuationToken token = null;
var entities = new List<MyEntity>();
do
{
var queryResult = table.ExecuteQuerySegmented(new TableQuery<MyEntity>(), token);
entities.AddRange(queryResult.Results);
token = queryResult.ContinuationToken;
} while (token != null);
如果您不需要每次都需要所有的行,那么使用yield
:按需(延迟(检索项目会更高效
public async Task<IEnumerable<T>> GetAll<T>(string tableName) where T : class
{
var table = this.GetCloudTable(tableName);
TableContinuationToken token = null;
do
{
var q = new TableQuery<T>();
var queryResult = await table.ExecuteQuerySegmentedAsync(q, token);
foreach (var item in queryResult.Results)
{
yield return item;
}
token = queryResult.ContinuationToken;
} while (token != null);
}
使用这种方法,您可以获得所有行,但如果您正在循环GetAll()
的结果并找到您要查找的内容,您可以只break
循环,并且GetAll()
方法将停止,而不从表中检索下一行。
有了更新的Azure.Data.Tables SDK,这个时间现在要短得多,尤其是在使用System.Linq.Async nuget包时。有了它,你可以简单地写:
/// <summary>
/// Returns all rows in the table
/// </summary>
/// <typeparam name="T">Implementation of ITableEntity</typeparam>
/// <param name="tableClient">The authenticated TableClient</param>
/// <returns></returns>
public static async Task<List<T>> GetAllEntitiesAsync<T>(this TableClient tableClient) where T : class, ITableEntity, new()
{
return await tableClient.QueryAsync<T>(maxPerPage: 1000).ToListAsync().ConfigureAwait(false);
}
注意:通过一次请求1000行(最大值(,可以大幅减少请求总量。
源