1)Result Transformers
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
};
}
}
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();
OrderStatistics statistic = session.Load<OrderStatisticsTransformer, OrderStatistics>("orders/1");
2) OfType<T>
OfType<T>是在客户端进行数据转换
比如说我们有一个这样的索引:
public class Product_ByQuantity : AbstractIndexCreationTask<Product>
{
public Product_ByQuantity()
{
Map = products => from product in products
select new
{
QuantityInWarehouse = product.QuantityInWarehouse
};
TransformResults = (database, results) => from r in results
select new
{
Name = r.Name,
Description = r.Description
};
}
}
产品类:
public class Product
{
public string Id { get; set; }
public string ArticleNumber { get; set; }
public string Name { get; set; }
public string Manufacturer { get; set; }
public string Description { get; set; }
public int QuantityInWarehouse { get; set; }
}
返回结果类:
public class ProductViewModel
{
public string Name { get; set; }
public string Description { get; set; }
}
查询的之后,进行转换
List<ProductViewModel> products = session.Query<Product, Product_ByQuantity>()
.Where(x => x.QuantityInWarehouse > 100)
.OfType<ProductViewModel>()
.ToList();
3)ProjectFromIndexFieldsInto
这是map-only的索引
public class Product_ByQuantityNameAndDescription : AbstractIndexCreationTask<Product>
{
public Product_ByQuantityNameAndDescription()
{
Map = products => from product in products
select new
{
QuantityInWarehouse = product.QuantityInWarehouse,
Name = product.Name,
Description = product.Description
};
Stores.Add(x => x.Name, FieldStorage.Yes);
Stores.Add(x => x.Description, FieldStorage.Yes);
}
}
//查询
List<ProductViewModel> products = session.Query<Product, Product_ByQuantityNameAndDescription>()
.Where(x => x.QuantityInWarehouse > 50)
.ProjectFromIndexFieldsInto<ProductViewModel>()
.ToList();
4)客户端转换
索引的定义:
public class Product_ById : AbstractIndexCreationTask<ProductItem>
{
public Product_ById()
{
Map = products => from product in products
select new
{
product.Id
};
}
}
var warehouses = session.Query<dynamic, Product_ById>()
.Customize(x => x.TransformResults((query, results) =>
results.Cast<dynamic>().GroupBy(p => p.WarehouseId).Select(g =>
{
double count = 0;
int totalSum = 0;
var products = g.Select(product =>
{
count++;
totalSum += product.Price;
return new ProductItemViewModel
{
Name = product.Name,
Description = product.Description
};
}).ToList();
return new Warehouse()
{
Id = g.Key,
Products = products,
AverageProductPrice = totalSum / count,
};
}))).ToList();