有谁知道查询空值Azure Table中存储的正确方法。从我读过的东西,这是可能的(虽然有防止其发展存储错误)。不过,我不断收到以下错误,当我在现场云存储这样做的:

  

一的请求输入是无效的。

这是一个简单化的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;

如果我运行查询,不检查空,它工作正常。我认识的一个可能的解决办法是在其上运行集合的第二个查询,此查询带回。我不介意做,如果我需要,但想知道如果我能先得到这种方法工作。

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

有帮助吗?

解决方案

的问题是,因为天青表存储不具有一个模式,空塔实际上不存在。这就是为什么你的查询是无效的。还有如表存储空列没有这样的事情。你可以做类似的商店一个空字符串,如果你真的不得不这样做。真的不过根本问题这里要说的是Azure的表存储还真不是建比分区键和行键以外的任何栏目进行查询。您在这些非标一列的查询每次你做一个表扫描。如果你开始得到很多,你将有查询超时非常高速率数据。我建议设置为这些类型的查询手动索引。例如,你可以存储在同一个表,但是与该行关键的不同值相同的数据。最后,如果您的应用程序都没有得到疯狂的高使用率我只想用SQL Azure的,因为这将是该类型的你正在做的查询更加灵活。

更新:天蓝色的对表存储的设计,我会建议阅读的一个很好的指南。 http://azure.microsoft.com/en-我们/文档/物品/存储表设计导/

其他提示

我只是有这个问题,并发现了一个可爱的小忍者帽子戏法实际测试空值。虽然我直接使用Azure存储接口,我90%肯定它会为LINQ工作太多,如果你做的一样。

下面是我所做的检查,如果价格(的Int32?)为空:

not (Price lt 0 or Price gt 0)

我猜你的情况,你可以通过测试做LINQ相同的,如果fooBar.Termination_Date比DateTime.UtcNow小于或大于例如。是这样的:

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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top