1

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

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

但这不会在新的客户端存储库 2.0 中编译:

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

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

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

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

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

4

1 回答 1

2

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。

希望这可以帮助,

于 2013-02-27T23:03:20.657 回答