我在ravendb中有以下实体集合:
public class Provider
{
public string ProviderId {get; set;}
public string ProviderName {get; set;}
public string[] CategoryIds{get; set;}
}
public class Category
{
public string CategoryId {get; set;}
public string CategoryName {get; set;}
public string[] ServiceIds {get; set;}
}
public class Service
{
public string ServiceId {get; set;}
public string ServiceName {get; set;}
public string ServiceCode {get; set;}
}
这是一个2级的多对多关系。现在,我需要创建索引以平整结构,因此我搜索结果。
- 可以提供某个服务的搜索提供商
- 包含某个服务的搜索类别
- 提供商可以提供的搜索服务
我的索引结果模型应该喜欢:
public class ProviderCategoryService
{
public string ProviderId {get; set;}
public string ProviderName {get; set;}
public string CategoryId {get; set;}
public string CategoryName {get; set;}
public string ServiceId {get; set;}
public string ServiceName {get; set;}
public string ServiceCode {get; set;}
}
我可以仅以一个索引来实现上述功能,还是需要创建多个索引?
*编辑:使用多个字段然后使用Transformer的组。*
我提出了这个索引。
public class ProviderCategoryServiceSearch:AbstractMultiMapIndexCreationTask<IndexResult>
{
public ProviderCategoryServiceSearch()
{
AddMap<Provider>(providers => from p in providers from c in p.CategoryIds
select new {
ProviderId = p.ProviderId,
ProviderName = p.ProviderName,
CategoryId = c,
CategoryName = (string)null,
ServiceId = (string)null,
ServiceName = (string)null,
ServiceCode = (string)null,
});
AddMap<Category>(categories => from c in categories from s in ServiceIds
select new {
ProviderId = (string)null,
ProviderName = (string)null,
CategoryId = c.CategoryId,
CategoryName = c.CategoryName,
ServiceId = s,
ServiceName = (string)null,
ServiceCode = (string)null,
});
Reduce = results => from r in results
group r by new {r.CategoryId, r.ServiceId} into g
from record in g
select new {
ProviderId = g.Select(x => x.ProviderId).FirstOrDefault(x => x != null),
ProviderName = g.Select(x => x.ProviderName).FirstOrDefault(x => x != null),
CategoryId = g.Key.CategoryId,
CategoryName = g.Select(x => x.CategoryName).FirstOrDefault(x => x != null),
ServiceId = g.Key.ServiceId,
ServiceName = (string)null,
ServiceCode = (string)null,
};
}
public class MyTransformer : AbstractTransformerCreationTask<IndexResult>
{
public MyTransformer()
{
TransformResults = results => from r in results
let s= LoadDocument<Service>(r.ServiceId)
select new {
ProviderId = r.ProviderId,
ProviderName = r.ProviderName,
CategoryId = r.CategoryId,
CategoryName = r.CategoryName,
ServiceId = r.ServiceId,
ServiceName = s.ServiceName,
ServiceCode = s.ServiceCode,
};
}
}
}
此实现有任何问题吗?
该方法还可以。这是在Raven 1.0中完成事情的方式。但是,由于在2.0和2.5中引入LoadDocument
以来,它已成为不必要的。在这里阅读更多。您会发现当可以将相关文档加载到索引映射中时,您不需要多图像或减少。