Вернуть список документов из CosmosDB WHERE для фильтрации вложенных данных

Я пытаюсь выбрать "docType" : "offer" из моей коллекции cosmosdb, где идентификатор компании совпадает с идентификатором компании пользователя.

Образец документа CosmosDB

{
    "id": "507f1f77bcf86cd799439011",
    "company": [
        {
            "id": "D4B7B6CA-116C-452C-AEC7-58999567CD8Z",
            "name": "A"
        },
        {
            "id": "D4B7B6CA-116C-452C-AEC7-58999567CD8C",
            "name": "B"
        }
    ],
    "docType": "offer"
}

Запрос: вот мой текущий запрос, но он не работает как недопустимый && для bool и IEnumerable

var queryOffers = from doc in _client.CreateDocumentQuery<Offer>(collectionUri, DefaultOptions)
            where doc.docType == "offer" && doc.Companies.Any(i => i.id == user.company.companyId)
            select doc;

Обратите внимание, что мой cosmosdb использует SQL API.


person Adam    schedule 29.10.2018    source источник
comment
Я не верю, что Any поддерживается Document DB.   -  person Brendan Green    schedule 30.10.2018
comment
Я думаю, вы можете выполнить прямой запрос, который делает что-то вроде этого: select * from c JOIN co in c.company where c.docType = 'offer' and co.id IN ("your_co_id")   -  person Brendan Green    schedule 30.10.2018


Ответы (2)


Я столкнулся с аналогичной проблемой, когда мне нужно было использовать вложенный Any()/Contains() внутри существующего лямбда-выражения. Мне пришлось добавить дополнительное избыточное поле, чтобы иметь возможность запрашивать, поскольку Any()/Contains() таким образом не поддерживается.

Посмотрите сами: Используйте Linq.Any () внутри Linq.Where () в CosmosDb

В вашем случае вам понадобится дополнительный List из companyIds, и после этого вы сможете вложить Any() в where()

person bit    schedule 31.10.2018

person    schedule
comment
Это доставит все данные клиенту, а затем применит предложение where, верно? - person Brendan Green; 30.10.2018