我想获取Azure表中所有实体的列表。
有什么想法可以编写这个查询吗?
我想获取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个实体可用,则会返回一个“续标记”,该标记可用于获取下一组实体。实际上,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
是个坏主意。我已经修复了代码。感谢你提醒我。 - Gaurav Mantri如果您不需要每次都获取全部行,那么通过使用 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);
}