ravendb - 在 RavenDB 索引中通过查询加载文档
问题描述
我有以下结构:
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()
});
}
}
我该如何解决这个问题?
解决方案
您不能在索引内创建查询,要获得所需的信息,您必须在集合上创建一个map-reduce 索引,按 on和在 reduce 函数中应用在字段上并排序. 要获取名称字段,您必须使用LoadDocument扩展。Orders
CustomerId
Sum()
Amount
LastOrderedDate
Name
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()
};
}
}
推荐阅读
- ios - Swift iOS - 如果发现错误,请尽早跳出状态
- java - 分页库最初返回空列表
- ios - 在 Swift 中以编程方式从主 TabBarController 转到嵌套的 ViewController
- algorithm - 如何将无向图转换为每个节点最多有 K 个父节点的有向图?
- python - 输入键 Python Tkinter
- html - 如何在同一行对齐文本框?
- spring-boot - Spring Boot actuator - 实现自定义指标
- javascript - 我应该将可选参数默认设置为 false 还是 true
- python-3.x - 使用递归进行洪水填充 - Python
- c# - 如何在不重新编码的情况下更改课程?