2014-08-27 63 views
2

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

回答

1

請參閱我們在第一次引入新的表服務層時發佈的Tables Deep Dive blog post。如果您需要LINQ支持,請參閱Azure Storage Client Library 2.1 blog post

我們強烈建議升級到表服務層,因爲它針對NoSQL場景進行了優化,因此提供了更好的性能。

+0

創建TableQuery並將其傳遞給表達式參數Expression >時,返回對象的類型爲IQueryable。我遇到的問題是ExecuteQuerySegmented不接受IQueryable作爲參數,它需要一個TableQuery。你能否提供一個如何運作的例子?提供的博客帖子未包含此場景 – Brosto 2014-08-29 19:36:04

+1

與上面示例代碼中使用的AsTableServiceQuery類似,還有一個AsTableQuery幫助器方法可用於獲取TableQuery。請讓我們知道,如果這對你有用。 – 2014-09-22 22:39:26

+0

AsTableQuery幫手完成了這個技巧。對於需要這些的人,請將Microsoft.WindowsAzure.Storage.Table.Queryable添加到您的使用語句中 – Brosto 2014-09-25 19:01:31