我正在创建一个查询,以包含最近30天的Cosmos实体:
var filter = TableQuery.GenerateFilterConditionForDate(
"Timestamp",
QueryComparisons.GreaterThanOrEqual,
DateTimeOffset.Now.Date.AddDays(-30));
接下来,我使用此过滤器创建一个查询:
var query = new TableQuery<ResponseEntity>().Where(filter);
接下来,我执行查询:
var result = await table.ExecuteQuerySegmentedAsync(query, null);
但是,由于某些原因,result
始终包含零(0)个匹配。
如果我执行的查询没有任何过滤器...
var query = new TableQuery<ResponseEntity>();
...我确实得到了所有实体。
查看生成的筛选器字符串,对我来说看起来不错(与使用Cosmos的查询生成器时,与Azure门户中的字符串相同)
Timestamp ge datetime'2018-09-15T22:00:00.0000000Z'
基于Timestamp
的查询是否有限制?
编辑:尝试切换到新的Microsoft.Azure.Cosmos.Table
NuGet程序包(当前处于预览版,版本 0.9.1 ),但是我仍然没有得到任何帮助通过Timestamp
过滤时的结果。
答案 0 :(得分:0)
Ted,请参阅我的工作代码。
代码:
using Microsoft.Azure.CosmosDB.Table;
using Microsoft.Azure.Storage;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JayGongCosmosTable
{
class Program
{
static void Main(string[] args)
{
TableQuerySegment <ResponseEntity> resultE= QueryTableAsync("test").Result;
foreach(ResponseEntity re in resultE)
{
Console.WriteLine("Timestamp: "+re.Timestamp);
Console.WriteLine("------------------------------------------");
}
Console.WriteLine("execute done");
Console.ReadLine();
}
public static async Task<TableQuerySegment<ResponseEntity>> QueryTableAsync(string tableName)
{
CloudStorageAccount storageAccount = CreateStorageAccountFromConnectionString("***");
CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
CloudTable table = tableClient.GetTableReference(tableName);
var filter = TableQuery.GenerateFilterConditionForDate(
"Timestamp",
QueryComparisons.GreaterThanOrEqual,
//QueryComparisons.LessThanOrEqual,
DateTimeOffset.Now.AddDays(-10).Date);
Console.WriteLine(filter);
var query = new TableQuery<ResponseEntity>().Where(filter);
var result = await table.ExecuteQuerySegmentedAsync(query, null);
return result;
}
}
class ResponseEntity : TableEntity
{
public string Name { get; set; }
public DateTimeOffset logtime { get; set; }
}
}
我的数据列表如下,没有过滤器:
如果我使用“时间戳记”作为过滤器,它将起作用:
我想提到的另一件事是,请尽可能避免使用timestamp
间隔查询。这样的查询将导致在服务器端进行整个表扫描。如果您的情况通常需要使用timestamp
间隔查询,请考虑选择timestamp
作为分区键或行键,以优化查询性能。
希望它对您有帮助。
最后,仅作总结,解决方案是uninstalling WindowsAzure.Storage
并切换使用using语句以使用Microsoft.Azure.CosmosDB.Table
中的类型。