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