使用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);
我提供两次上下文。为什么呢?
答案 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。
希望这有帮助,
乔