我有点想将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/