Запрос Cosmos DB по свойству типа

В моем проекте я хочу добавить наследование для некоторых классов и сохранить созданные объекты в коллекции документов в базе данных Cosmos DB. Чтобы сохранить информацию о типе, я использую этот параметр в JSON.net: https://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm

Но как я могу запросить коллекцию по типу, не извлекая все документы с помощью LINQ безопасным способом. Лучше всего было бы добавить свойство к этим классам с именем, например, Type, которое содержит информацию о свойстве «$ type» объекта JSON. Затем я могу запросить что-то вроде этого:

       return Client.CreateDocumentQuery<TEntity>(DocumentCollectionUri).Where(entity => entity.Type == typeof(Car).ToString());

Этот запрос LINQ будет преобразован в SQL, а затем отправлен на сервер. Я получаю только те объекты типа автомобиля. Это было бы оптимально, возможно ли что-то подобное и быстро?


person Niklas Raab    schedule 09.07.2018    source источник


Ответы (1)


Все, что вам нужно, это ваше свойство TEntity для реализации интерфейса какого-то типа, позволяет путь ICosmosEntity, у которого есть свойство EntityType, которое является строкой.

Затем все ваши объекты TEntity должны будут реализовать этот интерфейс, и они будут устанавливать nameof(TEntity) как EntityType.

Таким образом, вы можете сделать так, чтобы запрос выглядел так: return Client.CreateDocumentQuery<TEntity>(DocumentCollectionUri).Where(entity => entity.EntityType == nameof(Car)), который вернет именно то, что вам нужно.

Если вы застряли, я бы порекомендовал вам проверить, как обмен коллекциями работает в Космонавт. Похоже, это именно то, что вам нужно.

Отказ от ответственности: я создатель Cosmonaut.

person Nick Chapsas    schedule 09.07.2018