58

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

知道我将如何编写此查询吗?

4

2 回答 2

113

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

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);
于 2014-05-29T18:47:50.023 回答
9

如果您不需要每次都需要所有行,则通过使用以下方式按需(懒惰地)检索项目会更有效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()方法将停止而不从表中检索下一行。

于 2019-05-14T21:32:53.873 回答