siv*_*a.k 3 c# azure azure-table-storage
尝试通过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)
Run Code Online (Sandbox Code Playgroud)
查询:
var fromDate = DateTime.UtcNow.AddDays(-14);
Run Code Online (Sandbox Code Playgroud)
工作一:
from entity in AnalyticsStorage.ConversionTable.CreateQuery<ConversionAnalyticsModel>()
where entity.Date > fromDate
select entity
Run Code Online (Sandbox Code Playgroud)
不工作:
from entity in AnalyticsStorage.Table.CreateQuery<AnalyticsTableModel>()
where entity.ResponseTime > fromDate
select entity
Run Code Online (Sandbox Code Playgroud)
我确保在表格中实际填充了DateTime字段.注释掉where会使查询运行,但显然这不是很有用.
有没有人碰到这个?Azure Table Storage中是否存在可能遇到但无法看到的问题?
这是针对当前版本的Azure存储DLL(3.0.3)构建的,并且两个查询在同一个类中并排,只是在不同的方法中.
我不能说我知道为什么会发生这种情况但是在与Fiddler一段时间之后我发现它使用匿名类型作为字段名称:
() gt datetime'2014-02-27T21:55:16.9605195Z'
Run Code Online (Sandbox Code Playgroud)
应该:
RequestTime gt datetime'2014-02-27T21:55:16.9605195Z'
Run Code Online (Sandbox Code Playgroud)
一旦我注意到这一点,我使用pre-LINQ语法编写了一个查询:
var query = new TableQuery<AnalyticsTableModel>().Where(
TableQuery.GenerateFilterConditionForDate(
"ResponseTime",
QueryComparisons.GreaterThan,
fromDate));
Run Code Online (Sandbox Code Playgroud)
这非常有效.因此,当前LINQ库似乎存在一致性问题,导致它不能始终将模型中的字段映射到表中的字段.它可能是两个RequestTime并且ResponseTime是受保护的单词,所以我使用他们的名字打破了实现,没有它正确警告我.
| 归档时间: |
|
| 查看次数: |
2533 次 |
| 最近记录: |