在Client Storage Library 2.0中更改为AsTableServiceQuery()

时间:2013-02-27 10:18:48

标签: c# .net azure azure-storage azure-table-storage

使用TableServiceContext查询Azure表存储时,我会执行如下查询:

var entities = context.CreateQuery<TEntity>(TableName)
                      .AsTableServiceQuery()
                      .Where(condition);

但是这不能在新的Client Storage Library 2.0中编译:

  

方法'AsTableServiceQuery'没有重载需要0个参数。

唯一可用的方法是AsTableServiceQuery(TableServiceContext context);

这意味着我需要具备以下条件:

var entities = context.CreateQuery<TEntity>(TableName)
                      .AsTableServiceQuery(context)
                      .Where(condition);

我提供两次上下文。为什么呢?

1 个答案:

答案 0 :(得分:2)

IQueryProvider的工作方式是每个Linq扩展实际上修改了表达式树,并通过CreateQuery将其传递给提供者本身。

(见http://msdn.microsoft.com/en-us/library/system.linq.iqueryprovider.aspx

由于您所指的实现是WCF数据服务,因此公开的提供程序创建DataServiceQuery而不是TableServiceQuery,实质上剥离了Azure特定的包装器。遗憾的是,DataServiceQuery不公开其关联的上下文,这是某些功能和某些可靠性检查所必需的。因此,最终解决方案要求最后一个方法再次接受上下文,以确保查询被正确包装并与创建它的上下文相关联。

请注意,DataServiceQuery不支持continuation,因此在查询Azure Tables时,您应始终使用AsTableServiceQuery(ctx)扩展来确保执行此包装。

我还建议您查看.Table命名空间中引入的新表服务层,因为它提供了额外的灵活性,显着的性能提升,并避免了这些复杂性。注意,TSL当前不公开IQueryProvider。

希望这有帮助,