25

有谁知道查询天蓝色表存储以获取空值的正确方法。从我读过的内容来看,这是可能的(尽管有一个错误阻止它在开发存储中使用)。但是,当我在实时云存储上这样做时,我不断收到以下错误:

请求输入之一无效。

这是我整理的 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 的情况下运行查询,它工作正常。我知道一个可能的解决方案是对该查询返回的集合运行第二个查询。如果需要,我不介意这样做,但想知道我是否可以先让这种方法发挥作用。

有人看到我做错了什么明显的事情吗?

4

5 回答 5

48

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

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

于 2010-11-24T02:58:47.380 回答
12

我刚刚遇到了这个问题,并找到了一个不错的小忍者技巧来实际测试空值。虽然我直接使用 Azure 存储接口,但我 90% 肯定如果你这样做,它也适用于 LINQ。

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

not (Price lt 0 or Price gt 0)

我猜在您的情况下,您可以通过测试 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;
于 2019-02-04T10:43:56.277 回答
3

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

Mike S 上面的回答让我走上了正确的道路。

于 2021-06-25T15:21:28.050 回答
1

对于字符串,我们可以与空字符串进行比较。

IsNotBlank(value) 

可:

(Value gt '') 
于 2021-03-14T19:24:57.117 回答
0

使用适用于 .NET 的 Azure 表客户端。查询nullGuid 值。

在示例代码中,属性的名称是MyColumn

var filter = Azure.Data.Tables.TableClient
      .CreateQueryFilter($"not(MyColumn gt {Guid.Empty})");

TableClient.CreateQueryFilter方法将创建过滤器

not(MyColumn gt guid'00000000-0000-0000-0000-000000000000')
于 2022-02-16T13:35:56.437 回答