Skip to main content

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
transformerNamestringName of a transformer to use.
Return Value
IRavenQueryableInstance 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);