Во-первых, что-то не совсем понятно по тому, как вы выражаете свой вопрос.
MyType foo = client.CreateDocumentQuery<MyType>(documentCollectionUri)
.ToList()
.FirstOrDefault(d => d.SomeProperty == someProperty);
Если вы храните несколько разных типов объектов в одном и том же вопросе, тогда с помощью параметра T
MyType
не гарантирует, что результаты, которые вы получите, будут только MyType
результатами, а все, что соответствует выражению, будет отображено и возвращено как MyType
.В CosmosDB SDK нет другой фильтрации, которая гарантирует, что запрос будет выполняться только для объектов этого типа, потому что CosmosDB не имеет контекста этого.
Единственный надежный способ сделать это, используя метод ReplaceDocumentAsync
заключается в том, чтобы (как сказал Alex AIT) добавить свойство Id
с атрибутом [JsonProperty("id")]
к вашему объекту.Учитывая, что это DTO, а не объект Domain, это свойство должно быть там, и оно действительно поможет с другими функциями, такими как удаление, и т. Д.
Я очень рекомендую взглянуть на Cosmonaut которая представляет собой CosmosDB ORM, которая также обеспечивает совместное использование коллекций на основе типов и те же запросы и обновления, которые вы пытаетесь достичь, не связываясь с какой-либо подобной логикой.
Отказ от ответственности: я являюсь создателем Cosmonaut
В примечании не следует использовать ToList()
для IQueryable, созданного с использованием CreateDocumentQuery
, но вместо этого использовать метод .AsDocumentQuery()
для него, а затем использовать комбинацию while(query.HasMoreResults)
, а затем query.ExecuteNextAsync()
метод правильного использования функциональности разбитого на страницы CosmosDB.