首页 > 解决方案 > 在 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()
        });
    }
}

我该如何解决这个问题?

标签: ravendb

解决方案


您不能在索引内创建查询,要获得所需的信息,您必须在集合上创建一个map-reduce 索引,按 on和在 reduce 函数中应用在字段上并排序. 要获取名称字段,您必须使用LoadDocument扩展。OrdersCustomerIdSum()AmountLastOrderedDateName

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

推荐阅读