У меня есть модель ProductDocument
в CosmosDB, которая представляет Продукт. Внутри этой модели есть поддокумент contributors
, в котором указано, кто внес вклад в Продукт. Каждый участник имеет role
.
Теперь я экспериментировал с запросом, который должен:
- Только выберите
ProductDocument
с contributor.roleDescription
из Автор
- Выберите только
ProductDocument
с division
из Паб 1
- Включать только
contributors
вложенные документы с contributor.roleDescription
из Author в набор результатов.
Теперь я борюсь с:
- Часть 3 выбора выше. Как мне выполнить этот бит, поскольку мой набор результатов включает в себя оба
contributor.roleDescription
из Автор И Illustrator
Пример Космос Модель:
[
{
"id": "1",
"coverTitle": "A Title",
"pubPrice": 2.99,
"division" :"Pub 1",
"Availability": {
"code": "20",
"description": "Digital No Stock"
},
"contributors": [
{
"id": 1,
"firstName": "Brad",
"lastName": "Smith",
"roleDescription": "Author",
"roleCode": "A01"
},
{
"id": 2,
"firstName": "Steve",
"lastName": "Bradley",
"roleDescription": "Illustrator",
"roleCode": "A12"
}
]
},
{
"id": "2",
"coverTitle": "Another Title",
"division" :"Pub 2",
"pubPrice": 2.99,
"Availability": {
"code": "50",
"description": "In Stock"
},
"contributors": [
{
"id": 1,
"firstName": "Gareth Bradley",
"lastName": "Smith",
"roleDescription": "Author",
"roleCode": "A01"
}
]
}]
Вот мой SQL, с которым я играл в Data Explorer :
SELECT VALUE p
FROM Products p
JOIN c IN p.contributors
WHERE c.roleDescription = 'Author'
AND p.division = 'Pub 1'
Вот мой запрос LINQ из моего сервиса:
var query = client.CreateDocumentQuery<ProductDocument>(
UriFactory.CreateDocumentCollectionUri("BiblioAPI", "Products"),
new FeedOptions
{
MaxItemCount = -1,
EnableCrossPartitionQuery = true
}
)
.SelectMany(product => product.Contributors
.Where(contributor => contributor.RoleDescription == "Author")
.Select(c => product)
.Where(p => product.Division == "Pub 1"))
.AsDocumentQuery();
List<ProductDocument> results = new List<ProductDocument>();
while (query.HasMoreResults)
{
results.AddRange(await query.ExecuteNextAsync<ProductDocument>());
}
Он выбирает правильные записи, но как отменить выбор вложенного документа Illustrator участника, потому что на данный момент я получаю следующее:
{
"id": "1",
"coverTitle": "A Title",
"pubPrice": 2.99,
"division" :"Pub 1",
"Availability": {
"code": "20",
"description": "Digital No Stock"
},
"contributors": [
{
"id": 1,
"firstName": "Brad",
"lastName": "Smith",
"roleDescription": "Author",
"roleCode": "A01"
},
{
"id": 2,
"firstName": "Steve",
"lastName": "Bradley",
"roleDescription": "Illustrator",
"roleCode": "A12"
}
]
}
Но я хочу получить следующий вывод, исключая вложенный документ автора Illustrator:
{
"id": "1",
"coverTitle": "A Title",
"pubPrice": 2.99,
"division" :"Pub 1",
"Availability": {
"code": "20",
"description": "Digital No Stock"
},
"contributors": [
{
"id": 1,
"firstName": "Brad",
"lastName": "Smith",
"roleDescription": "Author",
"roleCode": "A01"
}
]
}
EDIT:
Я бы хотел отфильтровать Product
, если один из вложенных документов contributor.roleDescription
равен Автору. Поэтому, если запись о товаре не содержит автора, я не хочу его
Я хочу включить каждый contributor
поддокумент, равный Author . Поэтому, если для Product
имеется несколько вложенных документов автора-автора, я хочу включить их, но исключить Illustrator .
Вы можете иметь коллекцию ProductDocuments
.
Справка по беглому синтаксису LINQ очень помогла бы.