Results Transformers
Results Transformers have been introduced in RavenDB 2.5 to give the user the ability to do a server side projections (with possibility to load data from other documents).
Result Transformers are substituting the index TransformResults feature, marking it as obsolete.
Main features of the Result Transformers are:
I. Stand-alone, separated from Index.
public class Order
{
public DateTime OrderedAt { get; set; }
public Status Status { get; set; }
public string CustomerId { get; set; }
public IList<OrderLine> Lines { get; set; }
}
public class OrderStatisticsTransformer : AbstractTransformerCreationTask<Order>
{
public OrderStatisticsTransformer()
{
TransformResults = orders => from order in orders
select new
{
order.OrderedAt,
order.Status,
order.CustomerId,
CustomerName = LoadDocument<Customer>(order.CustomerId).Name,
LinesCount = order.Lines.Count
};
}
}
II. User can use them on index results on demand.
What does it mean? It means if you want load whole Order
you can do so by not using a transformer in the query:
IList<Order> orders = session.Query<Order>()
.Where(x => x.CustomerId == "customers/1")
.ToList();
or if you want to get your transformed results then you can execute query as follows:
public class OrderStatistics
{
public DateTime OrderedAt { get; set; }
public Status Status { get; set; }
public string CustomerId { get; set; }
public string CustomerName { get; set; }
public int LinesCount { get; set; }
}
IList<OrderStatistics> statistics = session.Query<Order>()
.TransformWith<OrderStatisticsTransformer, OrderStatistics>()
.Where(x => x.CustomerId == "customers/1")
.ToList();
III. Can be used with automatic indexes.
OrderStatistics statistic = session.Load<OrderStatisticsTransformer, OrderStatistics>("orders/1");