Skip to main content

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");