【问题标题】:Querying azure table storage for null values查询 Azure 表存储中的空值
【发布时间】:2011-05-12 19:45:54
【问题描述】:

有谁知道查询天蓝色表存储以获取空值的正确方法。从我读过的内容来看,这是可能的(尽管有一个错误阻止它在开发存储中使用)。但是,当我在实时云存储上这样做时,我不断收到以下错误:

其中一个请求输入无效。

这是我整理的 LINQ 查询的简化版本。

var query = from fooBar in fooBarSVC.CreateQuery<FooBar>("FooBars")
        where fooBar.PartitionKey == kPartitionID
            && fooBar.Code == kfooBarCode
            && fooBar.Effective_Date <= kFooBarDate.ToUniversalTime()
            && (fooBar.Termination_Date > kFooBarDate.ToUniversalTime() || fooBar.Termination_Date == null)
        select fooBar;

如果我在不检查 null 的情况下运行查询,它可以正常工作。我知道一个可能的解决方案是对该查询返回的集合运行第二个查询。如果需要,我不介意这样做,但我想知道我是否可以先让这种方法发挥作用。

有人发现我做错了什么吗?

【问题讨论】:

    标签: azure azure-storage azure-table-storage


    【解决方案1】:

    问题是因为azure table storage没有schema,所以null列实际上是不存在的。这就是您的查询无效的原因。表存储中没有空列之类的东西。如果你真的需要的话,你可以做一些事情,比如存储一个空字符串。实际上,这里的基本问题是 Azure 表存储确实不是为了由分区键和行键以外的任何列查询而构建的。每次对这些非标准列之一进行查询时,您都在进行表扫描。如果您开始获取大量数据,您将有非常高的查询超时率。我建议为这些类型的查询设置手动索引。例如,您可以将相同的数据存储在同一个表中,但 Row 键的值不同。最终,如果您的应用程序没有得到疯狂的高使用率,我只会使用 SQL Azure,因为它对于您正在执行的查询类型会更加灵活。

    更新:Azure 有一个很棒的表存储设计指南,我建议您阅读。 http://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/

    【讨论】:

      【解决方案2】:

      我刚遇到这个问题,发现了一个很好的忍者小技巧来实际测试空值。虽然我直接使用 Azure 存储接口,但如果你这样做,我 90% 肯定它也适用于 LINQ。

      这是我检查 Price (Int32?) 是否为空的操作:

      not (Price lt 0 or Price gt 0)
      

      我猜在您的情况下,您可以通过测试 fooBar.Termination_Date 是否小于或大于 DateTime.UtcNow 来在​​ LINQ 中执行相同的操作。像这样的:

      where fooBar.PartitionKey == kPartitionID
        && fooBar.Code == kfooBarCode
        && fooBar.Effective_Date <= kFooBarDate.ToUniversalTime()
        && (fooBar.Termination_Date > kFooBarDate.ToUniversalTime()
        || (not (fooBar.Termination_Date < DateTime.UtcNow 
                  or fooBar.Termination_Date > DateTime.UtcNow))
      select fooBar;
      

      【讨论】:

      • 感谢@HansOlav 拯救了我的一天。我为此尝试了 2 个多小时,也尝试了一些替代方案,但除此之外似乎没有任何效果。
      【解决方案3】:

      对于名为 MyColumn 的字符串列,我可以输入:not(MyColumn gt '')

      上面的 Mike S 回答让我走上了正确的道路。

      【讨论】:

        【解决方案4】:

        对于字符串,我们可以比较空字符串。

        IsNotBlank(value) 
        

        可以是:

        (Value gt '') 
        

        【讨论】:

          【解决方案5】:

          将 Azure Tables 客户端 library 用于 .NET。查询null Guid 值。

          在示例代码中,属性的名称是MyColumn

          var filter = Azure.Data.Tables.TableClient
                .CreateQueryFilter($"not(MyColumn gt {Guid.Empty})");
          

          TableClient.CreateQueryFilter 方法将创建过滤器:

          not(MyColumn gt guid'00000000-0000-0000-0000-000000000000')
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-11
            • 2021-09-07
            • 2015-03-16
            相关资源
            最近更新 更多