查询azure表存储空值

Bro*_*sto 23 azure azure-storage azure-table-storage

有没有人知道查询azure表存储空值的正确方法.从我所读到的,它是可能的(虽然有一个错误阻止它在开发存储上).但是,当我在实时云存储上执行此操作时,我不断收到以下错误:

其中一个请求输入无效.

这是我放在一起的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;
Run Code Online (Sandbox Code Playgroud)

如果我运行查询而不检查null,它工作正常.我知道一个可能的解决方案是对该查询带回的集合运行第二个查询.如果我需要,我不介意这样做,但想知道我是否可以先采用这种方法.

有人看到任何明显我做错了吗?

Nat*_*ten 43

问题是因为azure表存储没有架构,所以null列实际上不存在.这就是您的查询无效的原因.表存储中没有空列.如果你真的需要,你可以做一些像存储空字符串的事情.实际上,这里的根本问题是Azure表存储确实不是由除分区键和行键之外的任何列来查询的.每次对其中一个非标准列进行查询时,您都在进行表扫描.如果您开始获得大量数据,那么查询超时率将会非常高.我建议为这些类型的查询设置手动索引.例如,您可以将相同的数据存储在同一个表中,但Row键的值不同.最终,

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


Pet*_*ter 11

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

迈克·S上面的回答让我走上了正确的道路。


小智 9

我刚刚遇到了这个问题,并找到了一个很好的忍者小技巧来实际测试空值。尽管我直接使用 Azure 存储接口,但我 90% 确定它也适用于 LINQ,如果您这样做的话。

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

not (Price lt 0 or Price gt 0)
Run Code Online (Sandbox Code Playgroud)

我猜在您的情况下,您可以通过测试 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;
Run Code Online (Sandbox Code Playgroud)