started - read from azure table storage c#
¿Cómo ejecutar una consulta de almacenamiento de tabla de Azure asíncrono? versión de cliente 4.0.1 (2)
Cuando la consulta de la tabla contenga la solución especificada para la cláusula de toma, se devolverán más elementos que los solicitados por la consulta. Un pequeño cambio en la expresión while resolverá ese problema.
public static async Task<IList<T>> ExecuteQueryAsync<T>(this CloudTable table, TableQuery<T> query, CancellationToken ct = default(CancellationToken), Action<IList<T>> onProgress = null) where T : ITableEntity, new()
{
var runningQuery = new TableQuery<T>()
{
FilterString = query.FilterString,
SelectColumns = query.SelectColumns
};
var items = new List<T>();
TableContinuationToken token = null;
do
{
runningQuery.TakeCount = query.TakeCount - items.Count;
TableQuerySegment<T> seg = await table.ExecuteQuerySegmentedAsync<T>(runningQuery, token);
token = seg.ContinuationToken;
items.AddRange(seg);
if (onProgress != null) onProgress(items);
} while (token != null && !ct.IsCancellationRequested && (query.TakeCount == null || items.Count < query.TakeCount.Value));
return items;
}
EDITADO : Gracias a una sugerencia de PaulG, se corrigió el problema con el recuento de resultados cuando la consulta contiene la cláusula take y ExecuteQuerySegmentedAsync
devuelve los elementos en varios pases.
Desea ejecutar consultas asíncronas en Azure Storage Client versión 4.0.1
NO hay método ExecuteQueryAsync () ..
Me estoy perdiendo algo? ¿Debemos seguir utilizando el ExecuteQuerySegmentedAsync todavía? Gracias.
Termino haciendo un método de extensión para usar ExecuteQuerySegmentedAsync. No estoy seguro de si esta solución es óptima, si alguien tiene algún comentario, no lo dude.
public static async Task<IList<T>> ExecuteQueryAsync<T>(this CloudTable table, TableQuery<T> query, CancellationToken ct = default(CancellationToken), Action<IList<T>> onProgress = null) where T : ITableEntity, new()
{
var items = new List<T>();
TableContinuationToken token = null;
do
{
TableQuerySegment<T> seg = await table.ExecuteQuerySegmentedAsync<T>(query, token);
token = seg.ContinuationToken;
items.AddRange(seg);
if (onProgress != null) onProgress(items);
} while (token != null && !ct.IsCancellationRequested);
return items;
}