Возврат списка документов из CosmosDB WHERE для фильтрации вложенных данных - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь выбрать "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.

Ответы [ 2 ]

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

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

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

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

0 голосов
/ 30 октября 2018
        var queryOffers = _client.CreateDocumentQuery<Offer>(collectionUri, DefaultOptions)
            .Where(doc => doc.docType == "offer")
            .AsEnumerable()
            .Where(c => c.Company.Any(i => i.id == id));
...