我想得到所有产品的摘要,因为我想要使用它,只有最新的OrderHistory才有意义。我有成千上万的产品,每个产品都有数百个OrderHistory,但现在我只想要每个产品的产品ID和最新的OrderHistory。
public class ProductSummary
{
public int ProductId { get; set; }
public OrderHistory LastOrderHistory { get; set; }
}
OrderHistory存储在Product文档中,如下所示:
public class Product
{
public int Id { get; set; }
public int MarketGroupId { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public List<OrderHistory> OrderHistory { get; set; }
}
这就是OrderHistory的样子:
public class OrderHistory
{
public long OrderCount { get; set; }
public long Volume { get; set; }
public DateTime date { get; set; }
public double AvgPrice { get; set; }
}
现在我已经尝试了一些关于索引和查询的方法来运行,这是我的最新尝试,但它没有返回任何结果。
public class LatestProductOrderHistory : AbstractIndexCreationTask<Product, ProductSummary>
{
public LatestProductOrderHistory()
{
Map = products => from p in products
from oh in p.OrderHistory
select new
{
ProductId = p.Id,
LastOrderHIstory = p.OrderHistory.OrderByDescending(o => o.date).Last()
};
StoreAllFields(FieldStorage.Yes);
}
}
最后我的询问:
var results = session
.Query<ProductSummary, LatestProductOrderHistory>()
.ProjectFromIndexFieldsInto<ProductSummary>()
.Take(1024)
.Skip(start)
.ToList();
这个组合没有给我任何结果,我之前从未在ravendb中制作过索引,所以如果这是一个愚蠢的问题,我很抱歉。
编辑:嗯,我不确定我改变了什么,但现在我得到了#34;无法读取财产价值:Id&#34; EDIT2:以前编辑中的奇怪问题是通过重新启动vs和ravendb来解决的,所以当前结果没有结果
答案 0 :(得分:0)
正如Ayende所评论的那样,您必须将Reduce函数添加到索引中:
Reduce = results => from result in results
group result by result.Id into g
select new
{
Id = g.Key,
LastOrderHistory = g.SelectMany(x=> x.LastOrderHistory)
.OrderByDescending(o => o.Date).FirstOrDefault()
};
只需在地图功能中选择想要的字段就不会使你的索引成为Map / Reduce。
然后将您的索引查询为:
session.Query<ProductSummary, LatestProductOrderHistory>()