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/
小智 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)
归档时间: |
|
查看次数: |
10705 次 |
最近记录: |