升級到新的存儲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