在客户端存储库2.0中更改为AsTableServiceQuery()

本文关键字:AsTableServiceQuery 存储 客户端 | 更新日期: 2023-09-27 18:01:33

当使用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);

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

在客户端存储库2.0中更改为AsTableServiceQuery()

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

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

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

请注意,DataServiceQuery不支持延续,因此当对Azure表进行查询时,您应该始终使用AsTableServiceQuery(ctx)扩展来确保执行这种包装。

我还鼓励您查看.Table名称空间中引入的新表服务层,因为它提供了额外的灵活性、显著的性能提升,并避免了这些复杂性。注意,TSL目前没有公开IQueryProvider。

希望有帮助,

相关文章:
  • 没有找到相关文章