2010-11-19 87 views
12

有谁知道查询天空表存储空值的正确方法。从我读过的,这是可能的(虽然有一个错误,防止它在开发存储)。但是,当我在活动云存储上这样做时,我仍然收到以下错误:查询天空表存储空值

其中一个请求输入无效。

这是我放在一起的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,它工作正常。我知道一个可能的解决方案是对该查询带回的集合运行第二个查询。如果需要,我不介意这样做,但想知道我是否可以先采取这种方法。

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

回答

27

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

更新:Azure对桌面存储设计有很好的指导,我建议您阅读。 http://azure.microsoft.com/en-us/documentation/articles/storage-table-design-guide/

+0

Nathan,谢谢你的回应。这很有帮助。 – Brosto 2010-12-09 16:13:33

+0

@Nathan Totten:很好的回答! – 2011-11-23 15:15:58