我有点想将include与RavenDB Transformer一起使用。说我有以下文档类:

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中执行的操作吗?还是我错过了某些操作?

最佳答案

您不能仅使用变压器和当前域模型来完成您想做的事情。如果处理器确实知道它的工作,则可以使用类似您所拥有的那种变压器来完成。

但是,您可以使用Map/Reduce索引,然后通过Map/Reduce索引的结果使用Transformer来实现类似的操作。这完全取决于您要呈现的“其他内容”,但这是一种获取所有流程及其作业计数,然后使用转换器添加更多信息的方法:

映射/减少索引以按处理器获取作业计数:

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

这会给你这样的结果:

Id和JobCount来自索引的Reduce结果,而Name来自Transformer(通过LoadDocument)。

但是,如果您需要此结果,但需要Job文档中的更多信息,则可能必须完全走另一条路。

希望这可以帮助!

关于RavenDB Transformer包括文档列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30920591/

10-12 22:58