2013-08-22 8 views
5

Qual è il modo migliore per copiare tutte le righe da una tabella a un'altra tabella?
ho cercato qui di seguito il codice per ottenere tutte le righe di una tabella:Copia tutte le righe in un'altra tabella nell'archivio tabelle di Azure

TableServiceContext _dataContext; 
    public IEnumerable<T> GetAllEntities() 
    { 
     IQueryable<T> query = null; 
     try 
     { 
      query = _dataContext.CreateQuery<T>(_tableName); 
     } 
     catch (Exception ex) 
     { 

     } 
     return query.ToArray(); 
    } 

ma non ottiene le righe più di giro 900. Ho poche centinaia di migliaia di righe.
codice aggiornato:

public class TableRepository<T> : IRepository<T> 
    where T : TableEntity 
{ 
    protected readonly string _tableName; 
    protected readonly TableServiceContext _dataContext; 
    protected readonly CloudTable _tableReference; 

    public TableRepository(string tableName, CloudTableClient tableClient) 
    { 
     _tableName = tableName; 
     _dataContext = tableClient.GetTableServiceContext(); 
     _tableReference = tableClient.GetTableReference(tableName); 
     _dataContext.ResolveType = ResolveEntityType; 
     _dataContext.MergeOption = System.Data.Services.Client.MergeOption.NoTracking; 
    } 

    public IEnumerable<T> GetAllEntities() 
    { 
     List<T> allEntities = new List<T>(); 
     try 
     { 
      Microsoft.WindowsAzure.Storage.Table.TableContinuationToken tableContinuationToken = null; 
      do 
      { 
       var queryResponse = _tableReference.ExecuteQuerySegmented<T>(null, tableContinuationToken, null, null); 
       tableContinuationToken = queryResponse.ContinuationToken; 
       allEntities.AddRange(queryResponse.Results); 
      } 
      while (tableContinuationToken != null); 

     } 
     catch (Exception ex) 
     { 
      throw new DALException(_tableName,_dataContext.BaseUri.OriginalString, "An error occured while querying data", ex); 
     } 
     return allEntities; 
    } 

}

ma con l'errore:

Error 121 'T' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'TElement' in the generic type or method 'Microsoft.WindowsAzure.Storage.Table.CloudTable.ExecuteQuerySegmented

risposta

7

Il motivo che stai ricevendo solo 900 risultati indietro è perché si sta eseguendo in token di continuazione. Per impostazione predefinita, una singola richiesta al servizio di tabella restituirà un massimo di 1000 entità. Potrebbe essere inferiore a 1000 entità (e anche a 0) ma mai più di 1000. Se sono disponibili più entità, il servizio di tabella restituisce un valore continuation token che deve essere utilizzato per recuperare il successivo insieme di entità.

Quindi il codice dovrebbe cercare il token di continuazione e dovrebbe continuare a recuperare le entità fino a quando il token di tempo viene restituito dal servizio di tabella. Non dare un'occhiata al codice di esempio qui sotto:

private IEnumerable<T> FetchAllEntities() 
{ 
    List<T> allEntities = new List<T>(); 
    CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount; 
    CloudTable table = storageAccount.CreateCloudTableClient().GetTableReference("MyTable"); 
    Microsoft.WindowsAzure.Storage.Table.TableContinuationToken tableContinuationToken = null; 
    do 
    { 
     var queryResponse = table.ExecuteQuerySegmented<T>(null, tableContinuationToken, null, null); 
     tableContinuationToken = queryResponse.ContinuationToken; 
     allEntities.AddRange(queryResponse.Results); 
    } 
    while (tableContinuationToken != null); 
    return allEntities; 
} 

Aggiornamento

Per il vostro errore, provare a cambiare la seguente

public class TableRepository<T> : IRepository<T> 
    where T : TableEntity 

a

public class TableRepository<T> : IRepository<T> 
    where T : TableEntity, new() 

preavviso l'aggiunta di new() dopo il TableEntity.

+0

Mi viene visualizzato questo errore - Errore "T" deve essere un tipo non astratto con un costruttore pubblico senza parametri per utilizzarlo come parametro "TElement" nel tipo o metodo generico – Seenu

+0

Puoi condividere il codice ? –

+0

aggiornata la domanda con l'ultimo codice – Seenu