Получение нескольких типов сущностей из CosmosDb в одном запросе

Я пытаюсь получить все типы сущностей из коллекции в CosmosDb с помощью sql API. Но я получаю только BaseClass сущности вместо конкретных сущностей класса.

Вот мои модели:

public class ActivityBase: { // common properties for all activities... }
public class Running: ActivityBase { // specific properties to Running... }
public class Dancing: ActivityBase { // specific properties to Dancing... }

Вот текущий запрос:

 var query = Client.CreateDocumentQuery<ActivityBase>(collection.SelfLink, feedOptions)
                .Where(/*some filter which does not exclude entities by ActivityType*/) 
                .AsDocumentQuery();

В итоге я получаю List<ActivityBase>.

Мне нужен List<ActivityBase>, который содержит определенные сущности, такие как Running, Dancing, а не только объекты базового класса. Есть ли способ указать это в самом запросе?


person bit    schedule 15.07.2018    source источник


Ответы (1)


Тип T в CreateDocumentQuery просто сообщает SDK, где отображать извлеченные объекты, а не какие объекты запрашивать. Эта часть попадает в фильтр.

Если ваш фильтр не сужает запрос до типов Running и Dancing, тогда весь этот запрос будет извлекать любой тип объекта, а затем сопоставлять его с ActivityBase. Это означает, что даже если вы запрашиваете правильные типы, вы никогда их не увидите, потому что картограф их проигнорирует.

Вы можете быстро проверить это, изменив тип T на dynamic или Document и проверив содержимое.

person Nick Chapsas    schedule 15.07.2018
comment
Я согласен и знаю это. Мой фильтр не исключает по типу активности (обновил вопрос). Я пробовал dynamic способ, но тогда для каждого объекта мне придется пробовать применить его к каждому действию, что звучит не очень хорошо. Есть ли способ сделать это нестандартно? - person bit; 15.07.2018
comment
Нет, с этим SDK нет. Вам понадобится либо один запрос для каждого типа, либо какой-либо флаг, указывающий, что это за элемент, чтобы упростить повторное сопоставление. - person Nick Chapsas; 15.07.2018