Дискриминатор индекса и свойства полиморфного типа в 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
}

А затем просто запросите это нормально.

Другие вопросы по тегам