5

将所有行从一个表复制到另一个表的最佳方法是什么?
我尝试了下面的代码来获取表中的所有行:

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

        }
        return query.ToArray();
    }

但它的行数不会超过 900 行。我有几十万行。
更新代码:

 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;
    }

}

但有错误:

错误 121“T”必须是具有公共无参数构造函数的非抽象类型,才能将其用作泛型类型或方法“Microsoft.WindowsAzure.Storage.Table.CloudTable.ExecuteQuerySegmented”中的参数“TElement”

4

1 回答 1

8

您只得到 900 个结果的原因是您遇到了延续令牌。默认情况下,对表服务的单个请求将返回最多 1000 个实体。它可能少于 1000 个实体(甚至 0 个),但永远不会超过 1000 个。如果有更多可用实体,则表服务返回一个continuation token应该用于获取下一组实体的实体。

因此,您的代码应查找延续令牌并应继续获取实体,直到表服务返回时间令牌。请看下面的示例代码:

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;
}

更新

对于您的错误,请尝试更改以下内容

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

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

注意new()after的添加TableEntity

于 2013-08-22T09:26:41.717 回答