Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将所有行复制到Azure表存储中的另一个表_C#_Azure_Azure Storage_Azure Table Storage_Continuations - Fatal编程技术网

C# 将所有行复制到Azure表存储中的另一个表

C# 将所有行复制到Azure表存储中的另一个表,c#,azure,azure-storage,azure-table-storage,continuations,C#,Azure,Azure Storage,Azure Table Storage,Continuations,将所有行从一个表复制到另一个表的最佳方式是什么? 我尝试使用以下代码获取表中的所有行: TableServiceContext _dataContext; public IEnumerable<T> GetAllEntities() { IQueryable<T> query = null; try { query = _dataContext.CreateQuery<T

将所有行从一个表复制到另一个表的最佳方式是什么?
我尝试使用以下代码获取表中的所有行:

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

        }
        return query.ToArray();
    }
TableServiceContext\u dataContext;
公共IEnumerable GetAllenties()
{
IQueryable查询=null;
尝试
{
query=\u dataContext.CreateQuery(\u tableName);
}
捕获(例外情况除外)
{
}
返回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;
    }
公共类表存储库:IRepository
其中T:TableEntity
{
受保护的只读字符串\u tableName;
受保护的只读表ServiceContext\u dataContext;
受保护的只读CloudTable\u tableReference;
公共TableRepository(字符串tableName,CloudTableClient tableClient)
{
_tableName=tableName;
_dataContext=tableClient.GetTableServiceContext();
_tableReference=tableClient.GetTableReference(tableName);
_dataContext.ResolveType=ResolveEntityType;
_dataContext.MergeOption=System.Data.Services.Client.MergeOption.NoTracking;
}
公共IEnumerable GetAllenties()
{
List allenties=new List();
尝试
{
Microsoft.WindowsAzure.Storage.Table.TableContinuationToken TableContinuationToken=null;
做
{
var queryResponse=\u tableReference.ExecuteQuerySegmented(null,tableContinuationToken,null,null);
tableContinuationToken=queryResponse.ContinuationToken;
allenties.AddRange(queryResponse.Results);
}
while(tableContinuationToken!=null);
}
捕获(例外情况除外)
{
抛出新的DALException(_tableName,_dataContext.BaseUri.OriginalString,“查询数据时出错”,ex);
}
返回属性;
}
}

但有错误:

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


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

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

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;
}
private IEnumerable fetchallenties()
{
List allenties=new List();
CloudStorageAccount-storageAccount=CloudStorageAccount.DevelopmentStorageAccount;
CloudTable=storageAccount.CreateCloudTableClient().GetTableReference(“MyTable”);
Microsoft.WindowsAzure.Storage.Table.TableContinuationToken TableContinuationToken=null;
做
{
var queryResponse=table.ExecuteQuerySegmented(null,tableContinuationToken,null,null);
tableContinuationToken=queryResponse.ContinuationToken;
allenties.AddRange(queryResponse.Results);
}
while(tableContinuationToken!=null);
返回属性;
}
更新

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

public class TableRepository<T> : IRepository<T> 
    where T : TableEntity
公共类表存储库:IRepository
其中T:TableEntity

公共类表存储库:IRepository
其中T:TableEntity,new()

请注意,在
TableEntity
之后添加了
new()

我收到了此错误-错误121'T'必须是带有公共无参数构造函数的非抽象类型,才能将其用作泛型类型中的参数'TElement',或者方法更新了我的答案:)
public class TableRepository<T> : IRepository<T> 
    where T : TableEntity, new()