Итак, я пытаюсь использовать DocumentDB для хранения некоторых объектов, которые содержат список дочерних компонентов, которые могут быть разных типов. Простой пример того, что я хочу, чтобы хранить следующим образом:Как читать массив производных объектов из DocumentDB с .NET-клиентом
public class Component
{
public string ComponentType { get; set; }
}
public class BudgetComponent: Component
{
public decimal Budget { get; set; }
}
public class DateRangeComponent: Component
{
public DateTime Start { get; set; }
public DateTime End { get; set; }
}
public class Entity
{
public IEnumerable<Component> Components { get; set; }
}
Это позволит сэкономить правильно, но когда я пытаюсь читать я столкнуться с проблемами. Если бы я это сделать:
var docs = Client.CreateDocumentQuery<Entity>(Collection.DocumentsLink);
тогда я в конечном итоге с классом сущностей с перечнем Component
объектов; не BudgetComponent/DateRangeComponent
объектов.
Это имеет смысл, поскольку БД не хранит информацию о фактическом типе. Я бы предположил, что это довольно распространенный сценарий, поэтому я надеюсь, что есть решение.
Одна вещь, которую я пробовал, заключается в том, чтобы использовать неосновный вызов CreateDocumentQuery для возврата объекта Document и вручную де-сериализовать свойства. Есть 2 проблемы с подходом, который я использовал:
1) Кажется, мне нужно собрать коллекцию компонентов в виде коллекции объектов dynamic
, которая теряет безопасность типа, intellisense и т. Д. ... и быстро получит бесполезно, если у Компонентов есть собственные дети.
2) Возможно, более существенно, я теряю возможность использовать Linq для строго типизированных запросов против Entity.
Итак, есть ли элегантное решение этой проблемы с DocumentDB?
Извините, что связано с LINQ? Это полностью агностично для хранилища, даже если нет жесткого хранилища (только объекты памяти). Вы имели в виду [tag: entity-framework]? Если да, взгляните на [Реализация наследования (EF)] (http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-inheritance-with- заместитель сущность-рамки-в-в-Asp-нетто-MVC-приложения). –
Я имею в виду клиента DocumentDB .NET, который разрешает запросы Linq, которые преобразуются в запросы базы данных (аналогично Linq to Entities в EF). т.е. 'CreateDocumentQuery (Collection.DocumentsLink) .Where (e => e.Tenant ==" vds ");' Я не могу этого сделать, если я использую не-общую версию 'CreateDocumentQuery', насколько это возможно Я могу сказать. –
Gerald