我有点坚持使用带有RavenDB Transformer的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
}
在我的转换器中,我想查询处理器文档存储,并在Jobs Store上执行一个包含查找具有匹配处理器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中做什么,还是我错过了什么?
答案 0 :(得分:1)
仅使用变压器和当前的域模型,您无法做您想做的事情。如果处理器确实知道它的工作,你可以使用类似你所拥有的变压器来做到这一点。
但是,您可以使用Map / Reduce索引实现类似的功能,然后使用Transformer实现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
};
}
}
这会给你一个像这样的结果: Id和JobCount来自索引的Reduce结果,Name来自Transformer(通过LoadDocument)。
但是,如果您需要此结果,但需要来自“作业”文档的更多信息,则可能必须完全采用不同的路径。
希望这有帮助!