2014-06-15 11 views
39

desidera eseguire le query asincrone su Azure Client versione 4.0.1Come eseguire una query di archiviazione della tabella Azure async? versione client 4.0.1

non esiste un metodo ExecuteQueryAsync() ..

mi manca qualcosa? Dovremmo continuare a utilizzare ExecuteQuerySegmentedAsync ancora? Grazie.

+0

Qualcuno può indicarmi un documento che parla dei metodi disponibili nell'API di archiviazione e che non si trovano su architetture diverse? È frustrante che i documenti e le guide introduttive dicano di fare una cosa e quindi i metodi non ci sono. – Rory

risposta

49

Alla fine eseguo un metodo di estensione per utilizzare ExecuteQuerySegmentedAsync. Non sono sicuro che questa soluzione sia ottimale, se qualcuno ha qualche commento per favore non esitare.

+1

Joe, sì, il tuo esempio di codice è il modo migliore per farlo (usando 'ExecuteQuerySegmentedAsync' e combinando i risultati di ogni segmento). Il tuo codice sembra buono. L'unico suggerimento che ho è per te, se possibile, pre-allocare la lista 'items' ad una dimensione che sarà abbastanza grande da contenere tutte le entità la maggior parte del tempo usando il costruttore che accetta un intero. Ciò ridurrà la quantità di ridimensionamento necessaria. –

+1

@MikeFisher Grazie per il tuo commento, prenderò in considerazione. Tuttavia, è difficile conoscere a priori il numero di risultati da una query. Forse può essere ottimizzato su ogni iterazione. Si ridimensiona a un elenco 1000 record più grandi. – Joe

+1

Hai dimenticato di passare la cancellazioneToken in ExecuteQuerySegmentedAsync –

11

Quando la query di tabella contiene clausola di richiesta, la soluzione restituirà più elementi di quelli richiesti dalla query. Un piccolo cambiamento di espressione mentre risolverà quel 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; 
} 

CURA: Grazie ad un suggerimento da PaulG, corretto il problema con il conteggio di risultato quando query contiene prendere clausola e ExecuteQuerySegmentedAsync restituisce elementi in diversi passaggi.

Problemi correlati