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

C# 在客户端存储库2.0中更改为AsTableServiceQuery(),c#,.net,azure,azure-storage,azure-table-storage,C#,.net,Azure,Azure Storage,Azure Table Storage,使用TableServiceContext查询Azure表存储时,我会执行如下查询: var entities = context.CreateQuery<TEntity>(TableName) .AsTableServiceQuery() .Where(condition); 我提供了两次上下文。为什么?IQueryProvider的工作方式是,每个Linq扩展实际上修改表达式树,并通过Cre

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

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

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

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

(见附件)

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

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

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

希望这有帮助


回答得很好!我会使用新的表服务层,但它不使用IQueryProvider。
var entities = context.CreateQuery<TEntity>(TableName)
                      .AsTableServiceQuery(context)
                      .Where(condition);