Session: Querying: How to use transformers in queries?

Transformers can be used with session queries using TransformWith method.

Syntax

IRavenQueryable<TResult> TransformWith<TTransformer, TResult>()
	where TTransformer : AbstractTransformerCreationTask, new();

IRavenQueryable<TResult> TransformWith<TResult>(string transformerName);
Parameters
transformerName string Name of a transformer to use.
Return Value
IRavenQueryable Instance implementing IRavenQueryable interface containing additional query methods and extensions.

Example I

// return up to 128 entities from 'Products' collection
// transform results using 'Products_Name' transformer
// which returns only 'Name' property, rest will be 'null'
List<Product> results = session
	.Query<Product>()
	.Where(x => x.Name == "Chocolade")
	.TransformWith<Products_Name, Product>()
	.ToList();

Example II

Loading document inside transformer and projecting results to different type.

public class ProductWithCategoryAndSupplier
{
	public string Name { get; set; }

	public Supplier Supplier { get; set; }

	public Category Category { get; set; }
}

public class Products_WithCategoryAndSupplier : AbstractTransformerCreationTask<Product>
{
	public Products_WithCategoryAndSupplier()
	{
		TransformResults =
			products => from product in products 
						select new
						{
							Name = product.Name,
							Category = LoadDocument<Category>(product.Category),
							Supplier = LoadDocument<Supplier>(product.Supplier)
						};
	}
}

// return 1 entity from 'Products' collection
// transform results using 'Products_WithCategoryAndSupplier' transformer
// project results to 'ProductWithCategoryAndSupplier' class
ProductWithCategoryAndSupplier product = session
	.Query<Product>()
	.Where(x => x.Name == "Chocolade")
	.TransformWith<Products_WithCategoryAndSupplier, ProductWithCategoryAndSupplier>()
	.First();

Assert.Equal("Chocolade", product.Name);
Assert.Equal("Confections", product.Category.Name);
Assert.Equal("Zaanse Snoepfabriek", product.Supplier.Name);