升级到新的存储API版本4.2后,出现以下警告,我在对某些分段查询调用过时的方法。Azure表存储警告 - WCF数据服务已过时
'Microsoft.WindowsAzure.Storage.Table.CloudTableClient.GetTableServiceContext()' 是过时:“对于通过WCF数据访问的Windows Azure表 服务支持现在已经过时。建议您使用 Microsoft.WindowsAzure.Storage.Table命名空间来处理 表。
到目前为止,我还没有能够弄清楚如何在新的API上实现这个功能,并且没有任何示例能够找到。遗留代码仍然运行良好,但如果新的API支持更好的东西,我很想检查它并摆脱此警告。有人能指出我正确的方向如何使用新的API看起来像这样的分段查询?
这里是我的代码目前看起来像一个警告:
public AzureTablePage<T> GetPagedResults<T>(Expression<Func<T, bool>> whereCondition, string ContinuationToken, int PageSize, string TableName) {
TableContinuationToken token = GetToken(ContinuationToken);
var query = AzureTableService.CreateQuery<T>(TableName).Where(whereCondition).Take(PageSize).AsTableServiceQuery(AzureTableClient.GetTableServiceContext());
var results = query.ExecuteSegmented(token, new TableRequestOptions() { PayloadFormat = TablePayloadFormat.JsonNoMetadata });
if (results.ContinuationToken != null) {
return new AzureTablePage<T>() { Results = results.ToList(), HasMoreResults = true, ContinuationToken = string.Join("|", results.ContinuationToken.NextPartitionKey, results.ContinuationToken.NextRowKey) };
} else {
return new AzureTablePage<T>() { Results = results.ToList(), HasMoreResults = false };
}
}
public TableServiceContext AzureTableService {
get {
var context = AzureTableClient.GetTableServiceContext();
context.IgnoreResourceNotFoundException = true;
return context;
}
}
public CloudTableClient AzureTableClient {
get {
return mStorageAccount.CreateCloudTableClient();
}
}
解决方案
对于同一个问题的人,这里是更新的代码。
/* Add the following Using Statement */
using Microsoft.WindowsAzure.Storage.Table.Queryable;
public AzureTablePage<T> GetPagedResults<T>(Expression<Func<T, bool>> whereCondition, string ContinuationToken, int PageSize, string TableName) where T : class, ITableEntity, new() {
TableContinuationToken token = GetToken(ContinuationToken);
var query = AzureTableClient.GetTableReference(TableName).CreateQuery<T>().Where(whereCondition).Take(PageSize).AsTableQuery();
var results = query.ExecuteSegmented(token, new TableRequestOptions() { PayloadFormat = TablePayloadFormat.JsonNoMetadata });
if (results.ContinuationToken != null) {
return new AzureTablePage<T>() { Results = results.ToList(), HasMoreResults = true, ContinuationToken = string.Join("|", results.ContinuationToken.NextPartitionKey, results.ContinuationToken.NextRowKey) };
} else {
return new AzureTablePage<T>() { Results = results.ToList(), HasMoreResults = false };
}
}
创建TableQuery并将其传递给表达式参数Expression>时,返回对象的类型为IQueryable。我遇到的问题是ExecuteQuerySegmented不接受IQueryable作为参数,它需要一个TableQuery。你能否提供一个如何运作的例子?提供的博客帖子未包含此场景 –
Brosto
2014-08-29 19:36:04
与上面示例代码中使用的AsTableServiceQuery类似,还有一个AsTableQuery帮助器方法可用于获取TableQuery。请让我们知道,如果这对你有用。 – 2014-09-22 22:39:26
AsTableQuery帮手完成了这个技巧。对于需要这些的人,请将Microsoft.WindowsAzure.Storage.Table.Queryable添加到您的使用语句中 – Brosto 2014-09-25 19:01:31