CloudStorageAccount, выполнение запроса tablecquery

#c# #azure #azure-sql-database #azure-service-fabric

#c# #azure #azure-sql-database #azure-service-fabric

Вопрос:

Я пытаюсь сделать запрос к моей облачной таблице. То, что я делал до этого, получало все элементы определенной таблицы, но это занимает много времени.

 public static List<CollectItem> GetCollectItems(string connectionString, string tableName, DateTime dateTime)
    {
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

        // Create the table client.
        CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

        // Create the CloudTable object that represents the "people" table.
        CloudTable table = tableClient.GetTableReference(tableName);

        TableContinuationToken token = null;
        List<CollectItem> entities = new List<CollectItem>();

        do
        {
            var queryResult = table.ExecuteQuerySegmented(new TableQuery<CollectItem>(), token);
            entities.AddRange(queryResult.Results);
            token = queryResult.ContinuationToken;
        } while (token != null);

        entities = entities.Where(x => x.Timestamp.DateTime.Year == dateTime.Year amp;amp;
                                       x.Timestamp.DateTime.Month == dateTime.Month amp;amp;
                                       x.Timestamp.DateTime.Day == dateTime.Day).ToList();

        return entities;
    }
  

Затем я попытался создать некоторые условия запроса

 do
        {
            TableQuery<CollectItem> itemStockQuery = new TableQuery<CollectItem>().Where(
                                                                        TableQuery.GenerateFilterConditionForInt("Timestamp", QueryComparisons.Equal, dateTime)
                                                                        );

            var queryResult = table.ExecuteQuerySegmented(itemStockQuery, token);
            entities.AddRange(queryResult.Results);
            token = queryResult.ContinuationToken;
        } while (token != null);
  

Но теперь то, что он делает, — это сопоставление года, месяца, дня, часа, минуты…. И мне нужно сопоставить только год, месяц и день.
А затем я попытался создать это, но он сказал, что это плохой запрос.

 TableQuery<CollectItem> itemStockQuery = new TableQuery<CollectItem>().Where(
                                                                        TableQuery.GenerateFilterConditionForInt("Timestamp.DateTime.Day", QueryComparisons.Equal, dateTime.Day)
                                                                        );
  

Мой вопрос в том, как я могу создать запрос запроса по метке времени, но только для свойства Year, Month и Day?

Ответ №1:

Вы должны создать столбец и создать для него индекс. Ваш текущий столбец datetime-column не проиндексирован и не должен быть, и именно по этой причине ваш запрос занимает много времени.

Вы можете создать столбец даты без информации о времени и создать индекс для этого столбца, или вы можете указать свой собственный формат, например. 20200928 в качестве столбца int для вашей даты.

Комментарии:

1. Мне нравится идея создания столбца, в котором будет храниться дата в формате int или string. Но я считаю, что невозможно поместить индекс в этот столбец. CloudTable имеет только индексированный столбец PartitionKey и RowKey, и невозможно добавить больше индексированных столбцов. Если я ошибаюсь, пожалуйста, скажите мне, как это сделать. Кроме того, если я не добавлю к нему индекс и не выполню поиск, потребуется ли значительно больше времени для возврата объектов?

2. вы правы! Это зависит от вашего дизайна модели. Вы можете создать несколько таблиц с требуемыми указанными ключами строк, которые возвращают выбранные вами объекты. learn.microsoft.com/de-de/azure/cosmos-db /…