Дискриминатор индекса и свойства полиморфного типа в RavenDB
Рассмотрим следующую (упрощенную) модель предметной области, хранящуюся в RavenDB:
public abstract class PriceCalculation
{
// omitted for brevity
}
public class CostBasedPriceCalculation : PriceCalculation
{
public decimal Margin { get; private set; }
}
public class FixedPriceCalculation : PriceCalculation
{
public decimal FixedPrice { get; private set; }
}
public class ProductPricingStrategy
{
public string ProductId { get; private set; }
public PriceCalculation PriceCalculation { get; private set; }
}
Сохраненная сущность ProductPricingStrategy
и я хотел бы иметь возможность запрашивать коллекцию по типу расчета цены, а также по конкретным переменным расчета цены. Например, я хотел бы получить набор всех стратегий ценообразования на продукты, имеющих расчет цены на основе затрат с маржой менее 0,2. Другими словами, я хотел бы иметь возможность запросить следующую проекцию:
public class FlattenedProductPricingStrategy
{
public string PriceCalculationType { get; set; }
public decimal? FixedPrice { get; set; }
public decimal? Margin { get; set; }
}
Подход грубой силы будет заключаться в том, чтобы хранить сглаженную иерархию классов, более точно соответствующую проекции, а не непосредственно объектную модель предметной области. После извлечения и сохранения в RavenDB плоский объект будет отображен в объекте домена. Я рассмотрел использование промежуточного объекта по другим причинам, таким как возможность обработки всех проблем сериализации в отображаемом классе, а также наличие буферной зоны для повторного факторинга, однако я был от него отстранен. Есть ли способ избежать этого промежуточного объекта и напрямую создать индекс на основе исходной объектной модели?
1 ответ
Вам нужно определить индекс следующим образом:
from s in docs.ProductPricingStrategy
select new
{
s.PriceCalculation.Margin,
s.PriceCalculation.FixedPrice
}
А затем просто запросите это нормально.