查询空值蔚蓝的表存储

问题描述 投票:20回答:2

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

其中一个请求输入无效。

这是我已经把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 azure-storage azure-table-storage
2个回答
43
投票

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

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


1
投票

我只是有这个问题,并发现了一个可爱的小忍者技巧来实际测试空值。虽然我直接使用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;
© www.soinside.com 2019 - 2024. All rights reserved.