【问题标题】:Change to AsTableServiceQuery() in Client Storage Library 2.0在客户端存储库 2.0 中更改为 AsTableServiceQuery()
【发布时间】:2013-02-13 02:35:19
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net azure azure-storage azure-table-storage


    【解决方案1】:

    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-08-26
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    相关资源
    最近更新 更多