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