无法使用Table API在CosmosDB中通过时间戳查询

时间:2018-10-16 15:28:40

标签: .net-core azure-storage azure-cosmosdb

我正在创建一个查询,以包含最近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过滤时的结果。

1 个答案:

答案 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; }

    }
}

我的数据列表如下,没有过滤器:

enter image description here

如果我使用“时间戳记”作为过滤器,它将起作用:

enter image description here

我想提到的另一件事是,请尽可能避免使用timestamp间隔查询。这样的查询将导致在服务器端进行整个表扫描。如果您的情况通常需要使用timestamp间隔查询,请考虑选择timestamp作为分区键或行键,以优化查询性能。

希望它对您有帮助。


最后,仅作总结,解决方案是uninstalling WindowsAzure.Storage并切换使用using语句以使用Microsoft.Azure.CosmosDB.Table中的类型。