RavenDB变换器包含文档列表

5

我在使用 RavenDB 转换器时遇到了一些困难,无法正确使用 include。假设我有以下文档类:

public class Processor
{
    public string Id { get; set; }
    // other properties
}

public class Job
{
    public string Id { get; set; }
    public string ProcessorId { get; set; }
    // other properties
}

这是我的视图模型:
public class ProcessorStatsViewModel
{
    public string Id { get; set; }
    public int JobCount { get; set; }
    // other properties
}

在我的转换器中,我想查询处理器文档存储,并在作业存储中进行包含,查找每个具有匹配处理器ID的作业。我找到的所有搜索结果都描述了当Processor类具有JobId列表时如何执行此操作。在RavenDB中是否有一种方法可以实现这一点?
我想要的转换器可能类似于:
public Processors_StatsViewModel()
{
    TransformerResults = procs => 
        from p in procs
        let jobs = Include<Jobs>(p.Id) // how can i specify something like where p.Id == j.ProcessorId ?
        select new
        {
            p.Id
            JobCount = jobs.Count
            // other stuff
        }
}

所有Transformer的LoadDocument、Include和Recurse方法都希望被查询的类具有列表引用ID,但在我的情况下,我需要相反的情况。
这是我是否可以在RavenDB中做的事情,还是我漏掉了什么?
1个回答

1
您无法仅使用变压器和当前域模型实现所需的操作。如果处理器确实了解其作业,则可以使用类似于您拥有的变压器的变压器来执行此操作。
但是,您可以通过Map/Reduce索引实现类似的功能,然后对Map/Reduce索引的结果进行转换器处理。这完全取决于您想要呈现的“其他内容”,但这是一种获取所有进程及其作业计数并使用变压器添加更多信息的方法:
使用Map/Reduce索引获取每个处理器的作业计数:
public class Jobs_ByProcessor : AbstractIndexCreationTask<Job, Jobs_ByProcessor.ReduceResult>
{
    public class ReduceResult
    {
        public string ProcessorId { get; set; }
        public int JobCount { get; set; }
    }

    public Jobs_ByProcessor()
    {
        Map = jobs => from job in jobs
                      select new ReduceResult
                      {
                          ProcessorId = job.ProcessorId,
                          JobCount = 1
                      };

        Reduce = results => from result in results
                            group result by result.ProcessorId
                                into g
                                select new
                                {
                                    ProcessorId = g.Key,
                                    JobCount = g.Sum(x => x.JobCount)
                                };
    }
}

变压器:

public class ProcessorJobTransformer : AbstractTransformerCreationTask<Jobs_ByProcessor.ReduceResult>
{
    public ProcessorJobTransformer()
    {
        TransformResults = results => from result in results
            let processor = LoadDocument<Processor>(result.ProcessorId)
            select new
            {
                Id = result.ProcessorId,
                Name = processor.Name,
                JobCount = result.JobCount
            };
    }
}

这将给你一个类似于这样的结果: enter image description here Id和JobCount来自索引的Reduce结果,而Name来自Transformer(通过LoadDocument)。
然而,如果你需要从Job文档中获取更多信息,可能需要完全不同的路线。
希望这可以帮助你!

这看起来会起作用,我只需要工作数量。谢谢帮忙! - Steven Garcia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接