【发布时间】:2014-07-19 08:47:42
【问题描述】:
我正在尝试获取 azure 表中所有实体的列表。
知道如何编写此查询吗?
【问题讨论】:
-
您是否使用任何特定于语言的库,例如.Net 存储客户端库?
-
我正在使用 Microsoft.WindowsAzure.Storage 库
标签: c# azure nosql azure-table-storage azure-tablequery
我正在尝试获取 azure 表中所有实体的列表。
知道如何编写此查询吗?
【问题讨论】:
标签: c# azure nosql azure-table-storage azure-tablequery
要回答您的问题,您可以执行以下操作:
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);
【讨论】:
http 是个坏主意。我已经修复了代码。感谢您提请我注意。
如果您不是每次都需要所有行,使用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() 方法将停止而不从表中检索下一行。
【讨论】: