Cosmos DB - Получение ошибки при создании ключа раздела «Межсекторный запрос требуется, но отключен» - PullRequest
0 голосов
/ 04 марта 2020

Я получаю следующую ошибку при создании ключа раздела в базе данных cosmos.

Исключительная ситуация при выполнении функции: SetUserSubscription -> Межсекторный запрос требуется, но отключен. Установите для x-ms-documentdb-query-enablecrosspartition значение true, укажите x-ms-documentdb-partitionkey или измените запрос, чтобы избежать этого исключения. \ R \ nActivityId: 4685a5b7-bce9-4855-b2d8-33353f2957d9, Microsoft. Azure .Documents.Common / 2.2.0.0, documentdb-do tnet -sdk / 2.1.3 Host / 32-bit MicrosoftWindowsNT / 6.2.9200.0 "

Вот мой код:

public static async Task<IEnumerable<T>> GetItemsAsync(Expression<Func<T, bool>> predicate, Expression<Func<T, object>> orderByDesc,int takeCount =-1)
        {
            ;
            var criteria = client.CreateDocumentQuery<T>(
                    UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId))
                .Where(predicate)
                .OrderByDescending(orderByDesc)
                .AsDocumentQuery();

            IDocumentQuery<T> query = criteria;

            List<T> results = new List<T>();
            while (query.HasMoreResults)
            {
                if (takeCount>-1 && results.Count >= takeCount)
                {
                    break;
                }
                results.AddRange(await query.ExecuteNextAsync<T>());
            }

            return results;
        }

private static async Task CreateCollectionIfNotExistsAsync()
        {
            try
            {
                await client.ReadDocumentCollectionAsync(
                    UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId));
            }
            catch (DocumentClientException e)
            {
                if (e.StatusCode == System.Net.HttpStatusCode.NotFound)
                {
                    await client.CreateDocumentCollectionAsync(
                        UriFactory.CreateDatabaseUri(DatabaseId),
                        new DocumentCollection
                        {
                            Id = CollectionId,
                            IndexingPolicy = new IndexingPolicy(new RangeIndex(DataType.String) { Precision = -1 }),
                            PartitionKey = new PartitionKeyDefinition { Paths = new System.Collections.ObjectModel.Collection<string> { GetPartitionKeyAttributeCosmoDbCollection(typeof(T)) } }
                        },
                        new RequestOptions { OfferThroughput = 1000 });
                }
                else
                {
                    throw;
                }
            }
        }
        public static string GetPartitionKeyAttributeCosmoDbCollection(Type t)
        {
            // Get instance of the attribute.
            CosmoDbCollection attribute =
                (CosmoDbCollection)Attribute.GetCustomAttribute(t, typeof(CosmoDbCollection));

            if (attribute == null)
            {
                throw new Exception("The attribute CosmoDbCollection was not found.");
            }

            return attribute.PartitionKey;
        }

Ответы [ 2 ]

0 голосов
/ 06 марта 2020

Как уже упоминалось в комментарии , необходимо включить Cross partition query, используя параметры подачи следующим образом,

  var criteria = client.CreateDocumentQuery<T>(
                    UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId),new FeedOptions { EnableCrossPartitionQuery=true})
0 голосов
/ 04 марта 2020

Моя проблема была решена, когда я добавил new FeedOptions { EnableCrossPartitionQuery=true}

public static async Task<IEnumerable<T>> GetItemsAsync(Expression<Func<T, bool>> predicate, Expression<Func<T, object>> orderByDesc, int takeCount = -1)
        {
            var criteria = client.CreateDocumentQuery<T>(
                    UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId),new FeedOptions { EnableCrossPartitionQuery=true})
                .Where(predicate)
                .OrderByDescending(orderByDesc)
                .AsDocumentQuery();

            IDocumentQuery<T> query = criteria;

            List<T> results = new List<T>();
            while (query.HasMoreResults)
            {
                if (takeCount > -1 && results.Count >= takeCount)
                {
                    break;
                }
                results.AddRange(await query.ExecuteNextAsync<T>());
            }

            return results;
        }
...