通过RavenDB索引中的查询查询LoadDocument

问题描述

我具有以下结构:

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()
                                    };
    }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...