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

Posted

技术标签:

【中文标题】如何在 C# 中获取 Azure 表存储中的所有行?【英文标题】:How to get all rows in Azure table Storage in C#? 【发布时间】:2014-07-19 08:47:42 【问题描述】:

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

知道如何编写此查询吗?

【问题讨论】:

您是否使用任何特定于语言的库,例如.Net 存储客户端库? 我正在使用 Microsoft.WindowsAzure.Storage 库 【参考方案1】:

要回答您的问题,您可以执行以下操作:

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);

【讨论】:

我只能从中获取 PartitionKey 和 RowKey。为了获取所有属性,您必须添加:“varentities = table.ExecuteQuery(new TableQuery()).ToList();” (添加 )。这对我来说并不明显:) 在这种情况下 MyEntity 是我们自己的类?那么 getter 或 setter 将是什么? 对于在两个示例代码的第一行使用 'false' 有点困惑 - 需要明确的是,您正在主动禁用连接上的 HTTPS,对吧?为什么这有利于挂钩 HTTP? @BrettRigby...你是对的。让流量超过http 是个坏主意。我已经修复了代码。感谢您提请我注意。【参考方案2】:

如果您不是每次都需要所有行,使用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() 方法将停止而不从表中检索下一行。

【讨论】:

以上是关于如何在 C# 中获取 Azure 表存储中的所有行?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 中的 Azure.Storage.Blobs 从 Azure 存储 Blob 以 ByteArray 格式获取文件

C# Azure.Storage.Blobs SDK 如何列出和压缩容器中的所有文件并将压缩文件存储在另一个容器中

如何从 C# Core 中的 azure blob 存储中读取所有文件

如何使用 c# 在 azure 表存储中查找 2 dateTime 之间的小时数

如何获取 Azure 存储帐户密钥

无法从 Azure 存储表中获取所有项目