在客户端存储库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);
我提供了两次上下文。为什么?
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。
希望有帮助,
乔