我在C#Web项目中使用RavenDb。我有一个对象,我需要用每个子对象1行和一些根/父对象属性来查询其子集合。
注意:这不是实际的设计,只是针对此问题进行了简化。
public class OrderLine
{
public string ProductName { get; set; }
public int Quantity { get; set; }
public DateTime? ShipDate { get; set; }
}
public class Order
{
public int OrderId { get; set; }
public string CustomerName { get; set; }
public DateTime OrderDate { get; set; }
public List<OrderLine> OrderLines { get; set; }
}
带有订单行的订单是一个文档。因为并非所有产品都总是有库存,所以ShipDate将在每条生产线上更新。
我需要能够创建包含以下各列的最近10种产品的列表:
OrderId
Customer
ProductName
ShipDate
这不起作用,因为不支持SelectMany:
var query = from helper in RavenSession.Query<Order>()
.SelectMany(l => l.OrderLines, (order, orderline) =>
new { order, orderline })
select new
{
helper.order.OrderId,
helper.order.CustomerName,
helper.orderline.ProductName,
helper.orderline.ShipDate
};
var result = query.Where(x => x.ShipDate.HasValue)
.OrderByDescending(x => x.ShipDate.Value).Take(10);
我相信正确的做法是创建一个可以使列表变平的索引,但是我没有取得任何成功。我不认为Map-Reduce的情况会奏效,因为据我所知,它将有效地进行分组,从而将文档数减少到更少的行(在索引中)。但是在这种情况下,我试图将文档数量扩展到更多行(在索引中)。
我不想将每个OrderLine放在单独的文档中,但是我不知道我的选择是什么。
由于要对子类中的字段进行过滤和排序,因此需要确保所有需要的字段都已索引并存储。
public class ShippedItemsIndex
: AbstractIndexCreationTask<Order, ShippedItemsIndex.Result>
{
public class Result
{
public int OrderId { get; set; }
public string CustomerName { get; set; }
public string ProductName { get; set; }
public int Quantity { get; set; }
public DateTime ShipDate { get; set; }
}
public ShippedItemsIndex()
{
Map = orders =>
from order in orders
from line in order.OrderLines
where line.ShipDate != null
select new
{
order.OrderId,
order.CustomerName,
line.ProductName,
line.Quantity,
line.ShipDate
};
StoreAllFields(FieldStorage.Yes);
}
}
然后,您可以从索引投影到结果中。
var query = session.Query<Order, ShippedItemsIndex>()
.ProjectFromIndexFieldsInto<ShippedItemsIndex.Result>()
.OrderByDescending(x => x.ShipDate)
.Take(10);
var results = query.ToList();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句