Невозможно выполнить запрос по метке времени в CosmosDB с помощью API таблицы - PullRequest
0 голосов
/ 16 октября 2018

Я создаю запрос для включения сущностей Космос за последние 30 дней:

var filter = TableQuery.GenerateFilterConditionForDate(
                "Timestamp", 
                QueryComparisons.GreaterThanOrEqual,
                DateTimeOffset.Now.Date.AddDays(-30));

Далее я создаю запрос, используя этот фильтр:

var query = new TableQuery<ResponseEntity>().Where(filter);

Далее я выполняюquery:

var result = await table.ExecuteQuerySegmentedAsync(query, null);

Однако по какой-то причине result всегда содержит ноль (0) хитов.

Если я выполню запрос без какого-либо фильтра ...

var query = new TableQuery<ResponseEntity>();

... Я получаю все сущности.

Глядя на сгенерированную строку фильтра, она выглядит хорошо для меня (и идентична той, что на портале Azure при использовании построителя запросов для Cosmos):

Timestamp ge datetime'2018-09-15T22:00:00.0000000Z'

Есть ли какие-либо ограничения на запросы, основанные на Timestamp?

Редактировать: Попытка переключения на новый Microsoft.Azure.Cosmos.TableПакет NuGet (в настоящее время в предварительном просмотре, версия 0.9.1 ), но я все еще не получаю никаких результатов при фильтрации по Timestamp.

1 Ответ

0 голосов
/ 17 октября 2018

Тед, пожалуйста, обратитесь к моему рабочему коду.

код:

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, и вместо использования переключателей используйте типы из Microsoft.Azure.CosmosDB.Table.

...