问题描述
我具有以下结构:
public class Order
{
public string Id { get; set; }
public string CustomerId { get; set; }
public decimal Amount { get; set; }
public DateTimeOffset CreatedDate { get; set; }
}
public class Customer
{
public string Id { get; set; }
public string Name { get; set; }
}
我想导出所有具有订单成交额和最后订购日期的客户(RavenDB Stream)。
我已经有一个索引(Customers_ByTurnover
),可以输出此数据(map = Orders,按CustomerId减少)。尽管这只会列出已订购商品的客户。
我需要所有客户的索引,并将这些详细信息加载到每一行中。
这是我要编写的代码(Query
方法是伪的,实际上并不存在):
public class Customers_ByOrders : AbstractIndexCreationTask<Customer,Customers_ByOrders.Result>
{
public class Result
{
public string Id { get; set; }
public string Name { get; set; }
public decimal Turnover { get; set; }
public DateTimeOffset? LastOrderedDate { get; set; }
}
public Customers_ByOrders()
{
Map = items => items.Select(item => new Result()
{
Id = item.Id,Name = item.Name,Turnover = Query<Order>().Where(x => x.CustomerId == item.Id).Sum(x => x.Amount),LastOrderedDate = Query<Order>().Where(x => x.CustomerId == item.Id).Select(x => x.CreatedDate).OrderByDescending(x => x).FirstOrDefault()
});
}
}
我该如何解决这个问题?
解决方法
您无法在索引内创建查询,要获取所需信息,您将必须在Orders
集合上创建map-reduce index,在CustomerId
上按归类,并在reduce函数中在Sum()
字段上应用Amount
并订购LastOrderedDate
。要获取Name
名称字段,您将必须使用LoadDocument扩展名。
public class Customers_ByOrders : AbstractIndexCreationTask<Orders,Customers_ByOrders.Result>
{
public class Result
{
public string Id { get; set; }
public string Name { get; set; }
public decimal Turnover { get; set; }
public DateTimeOffset? LastOrderedDate { get; set; }
}
public Customers_ByOrders()
{
Map = orders => from o in orders
select new Result
{
Id = o.CustomerId,Turnover = o.Amount,LastOrderedDate = o.CreatedDate
};
Reduce = results => from result in results
group result by result.Id
into g
select new Result
{
Id = g.Key,Turnover = g.Sum(x => x.Turnover),LastOrderedDate = g.OrderByDescending(x => x.LastOrderedDate).Select(x => x.LastOrderedDate).FirstOrDefault()
};
}
}