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()