2014-08-27 46 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