在RavenDB索引中按查询加载文档
我的结构如下:在RavenDB索引中按查询加载文档,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 { g
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\u bytransformance
),它可以输出这些数据(map=订单,reduce by CustomerId)。虽然这只列出了已经订购的客户
我需要所有客户的索引,并将这些详细信息加载到每一行。
下面是我想写的代码(Query方法是伪方法,实际上并不存在):
公共类客户\u按订单:AbstractIndexCreationTask
{
公开课成绩
{
公共字符串Id{get;set;}
公共字符串名称{get;set;}
公共小数转换{get;set;}
公共DateTimeOffset?LastOrderedDate{get;set;}
}
公共客户(按订单)
{
Map=items=>items.Select(item=>newresult()
{
Id=项目Id,
名称=项。名称,
营业额=查询()。其中(x=>x.CustomerId==item.Id)。总和(x=>x.Amount),
LastOrderedDate=Query()。其中(x=>x.CustomerId==item.Id)。选择(x=>x.CreatedDate)。OrderByDescending(x=>x)。FirstOrDefault()
});
}
}
如何解决此问题?您不能在索引中创建查询,要获得所需信息,您必须在
订单
集合中创建查询,在客户ID上分组,并在reduce函数中应用Sum()
在金额
字段中排序LastOrderedDate
。要获取名称
名称字段,必须使用扩展名
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()
};
}
}
公共类客户\u按订单:AbstractIndexCreationTask
{
公开课成绩
{
公共字符串Id{get;set;}
公共字符串名称{get;set;}
公共小数转换{get;set;}
公共DateTimeOffset?LastOrderedDate{get;set;}
}
公共客户(按订单)
{
Map=订单=>从订单中的o开始
选择新结果
{
Id=o.CustomerId,
营业额=o.金额,
LastOrderedDate=o.CreatedDate
};
Reduce=results=>from result in results
按result.Id对结果进行分组
进入g
选择新结果
{
Id=g.键,
营业额=总营业额(x=>x营业额),
LastOrderedDate=g.OrderByDescending(x=>x.LastOrderedDate)。选择(x=>x.LastOrderedDate)。firstOrderDefault()
};
}
}
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()
};
}
}