如何在C#中获取Azure表存储中的所有行

本文关键字:存储 Azure 获取 | 更新日期: 2023-09-27 18:06:01

我正在尝试获取azure表中所有实体的列表。

你知道我该怎么写这个查询吗?

如何在C#中获取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行(最大值(,可以大幅减少请求总量。