在Azure表存储中筛选DateTime字段时出现异常

本文关键字:字段 异常 DateTime 筛选 Azure 存储 | 更新日期: 2023-09-27 17:49:54

我在尝试通过DateTime字段过滤Azure表存储结果时遇到了一种奇怪的问题。我对具有两个不同模型的两个不同表有两个不同的查询。两者都需要对DateTime字段进行过滤,但只有一个有效,另一个返回异常:

Microsoft.WindowsAzure.Storage.StorageException was unhandled by user code
HResult=-2146233088
Message=The remote server returned an error: (400) Bad Request.
Source=Microsoft.WindowsAzure.Storage
StackTrace:
    at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext)

查询:

 var fromDate = DateTime.UtcNow.AddDays(-14);

工作:

 from entity in AnalyticsStorage.ConversionTable.CreateQuery<ConversionAnalyticsModel>()
 where entity.Date > fromDate
 select entity

不工作:

 from entity in AnalyticsStorage.Table.CreateQuery<AnalyticsTableModel>()
 where entity.ResponseTime > fromDate
 select entity

我已经确保在表中实际填充了DateTime字段。注释掉where使查询运行,尽管显然这不是很有用。

有人遇到这个吗?Azure表存储中是否存在我可能遇到但看不到的漏洞?

这是基于当前版本的Azure存储DLL(3.0.3)构建的,两个查询并排在同一个类中,只是在不同的方法中。

在Azure表存储中筛选DateTime字段时出现异常

我不能说我知道为什么会发生这种情况,但经过一段时间与Fiddler我发现它是使用匿名类型的字段名:

() gt datetime'2014-02-27T21:55:16.9605195Z' 
应:

RequestTime gt datetime'2014-02-27T21:55:16.9605195Z'

一旦我注意到这一点,我写了一个查询使用pre-LINQ语法:

var query = new TableQuery<AnalyticsTableModel>().Where(
                TableQuery.GenerateFilterConditionForDate(
                    "ResponseTime", 
                     QueryComparisons.GreaterThan,  
                     fromDate));

这个效果很好。因此,当前的LINQ库似乎存在一致性问题,这导致它并不总是将模型中的字段映射到表中的字段。这可能是RequestTimeResponseTime都是受保护的词,所以我使用它们的名字是在没有适当警告我的情况下破坏了实现。