Polymorphism RavenDb中多映射索引的Clr类型筛选
我将所有继承自基类的对象存储在RavenDb中,并使用多映射索引搜索所有子类型,如下所示:Polymorphism RavenDb中多映射索引的Clr类型筛选,polymorphism,ravendb,Polymorphism,Ravendb,我将所有继承自基类的对象存储在RavenDb中,并使用多映射索引搜索所有子类型,如下所示: public class BaseRequest { public Guid Id { get; set; } public string RequestName { get; set; } public DateTime RequiredDate { get; set; } } public class RequestA: BaseRequest { public st
public class BaseRequest
{
public Guid Id { get; set; }
public string RequestName { get; set; }
public DateTime RequiredDate { get; set; }
}
public class RequestA: BaseRequest
{
public string SomethingForA { get; set; }
}
public class RequestB : BaseRequest
{
public int SomethingForB { get; set; }
}
public class AllRequests: AbstractMultiMapIndexCreationTask
{
public AllRequests()
{
AddMap<RequestA>(requests => from req in requests select new {req.RequestName, req.RequiredDate});
AddMap<RequestB>(requests => from req in requests select new {req.RequestName, req.RequiredDate });
}
}
public BaseRequest[] Search(string requestType, string requestName, DateTime? requestDate = null) {
var q = RavenSession.Query<BaseRequest, AllRequests>();
if (!string.IsNullOrEmpty(requestName)) {
q = (IRavenQueryable<BaseRequest>)Queryable.Where(q, x => x.RequestName == requestName);
}
if (requestDate.HasValue) {
q = (IRavenQueryable<BaseRequest>) Queryable.Where(q, x => x.RequiredDate == requestDate);
}
return q.ToArray();
}
database.PutIndex("Raven/DocumentsByEntityName", new IndexDefinition
{
Map =
@"from doc in docs
let Tag = doc[""@metadata""][""Raven-Entity-Name""]
select new { Tag, LastModified = (DateTime)doc[""@metadata""][""Last-Modified""] };",
Indexes =
{
{"Tag", FieldIndexing.NotAnalyzed},
},
Stores =
{
{"Tag", FieldStorage.No},
{"LastModified", FieldStorage.No}
}
});
public BaseRequest[] Search(string requestType, string requestName, DateTime? requestDate = null) {
var q = RavenSession.Query<AllRequests.SearchMap, AllRequests>();
if (!string.IsNullOrEmpty(requestName)) {
q = (IRavenQueryable<BaseRequest>)Queryable.Where(q, x => x.RequestName == requestName);
}
if (requestDate.HasValue) {
q = (IRavenQueryable<BaseRequest>) Queryable.Where(q, x => x.RequiredDate == requestDate);
}
if (!string.IsNullOrEmpty(requestType))
{
q =
q.Where(
x =>
x.RequestType == GetClrTypeFromPassedInValue(requestType));
}
return q.As<BaseRequest>().ToArray();
}
公共类基请求
{
公共Guid Id{get;set;}
公共字符串RequestName{get;set;}
所需公共日期时间日期{get;set;}
}
公共类RequestA:BaseRequest
{
用于{get;set;}的公共字符串something
}
公共类RequestB:BaseRequest
{
公共int SomethingForB{get;set;}
}
公共类AllRequests:AbstractMultiMapIndexCreationTask
{
公共所有请求()
{
AddMap(请求=>从请求中的req选择新的{req.RequestName,req.RequiredDate});
AddMap(requests=>from-req-in-requests-select-new{req.RequestName,req.RequiredDate});
}
}
我是这样搜索的:
public class BaseRequest
{
public Guid Id { get; set; }
public string RequestName { get; set; }
public DateTime RequiredDate { get; set; }
}
public class RequestA: BaseRequest
{
public string SomethingForA { get; set; }
}
public class RequestB : BaseRequest
{
public int SomethingForB { get; set; }
}
public class AllRequests: AbstractMultiMapIndexCreationTask
{
public AllRequests()
{
AddMap<RequestA>(requests => from req in requests select new {req.RequestName, req.RequiredDate});
AddMap<RequestB>(requests => from req in requests select new {req.RequestName, req.RequiredDate });
}
}
public BaseRequest[] Search(string requestType, string requestName, DateTime? requestDate = null) {
var q = RavenSession.Query<BaseRequest, AllRequests>();
if (!string.IsNullOrEmpty(requestName)) {
q = (IRavenQueryable<BaseRequest>)Queryable.Where(q, x => x.RequestName == requestName);
}
if (requestDate.HasValue) {
q = (IRavenQueryable<BaseRequest>) Queryable.Where(q, x => x.RequiredDate == requestDate);
}
return q.ToArray();
}
database.PutIndex("Raven/DocumentsByEntityName", new IndexDefinition
{
Map =
@"from doc in docs
let Tag = doc[""@metadata""][""Raven-Entity-Name""]
select new { Tag, LastModified = (DateTime)doc[""@metadata""][""Last-Modified""] };",
Indexes =
{
{"Tag", FieldIndexing.NotAnalyzed},
},
Stores =
{
{"Tag", FieldStorage.No},
{"LastModified", FieldStorage.No}
}
});
public BaseRequest[] Search(string requestType, string requestName, DateTime? requestDate = null) {
var q = RavenSession.Query<AllRequests.SearchMap, AllRequests>();
if (!string.IsNullOrEmpty(requestName)) {
q = (IRavenQueryable<BaseRequest>)Queryable.Where(q, x => x.RequestName == requestName);
}
if (requestDate.HasValue) {
q = (IRavenQueryable<BaseRequest>) Queryable.Where(q, x => x.RequiredDate == requestDate);
}
if (!string.IsNullOrEmpty(requestType))
{
q =
q.Where(
x =>
x.RequestType == GetClrTypeFromPassedInValue(requestType));
}
return q.As<BaseRequest>().ToArray();
}
public BaseRequest[]搜索(字符串requestType,字符串requestName,DateTime?requestDate=null){
var q=RavenSession.Query();
如果(!string.IsNullOrEmpty(requestName)){
q=(IRavenQueryable)Queryable.Where(q,x=>x.RequestName==RequestName);
}
if(requestDate.HasValue){
q=(IRavenQueryable)Queryable.Where(q,x=>x.RequiredDate==requestDate);
}
返回q.ToArray();
}
我想做的是根据请求的CLR类型进一步过滤结果。是否可以使用“Raven Entity Name”元数据字段执行此操作,如果可以,如何执行
我知道我可以只使用Query()
等,但可能以后需要按多种类型进行筛选,这些类型将由用户动态选择
注意:我真正想做的是使用索引来撤回给定某个RequestName的请求,但只返回RequestA(稍后只返回RequestA、RequestC和RequestDs)。我不想做多个查询来分别返回每个类型,我想做一个查询,通过参数进行查询,有时通过类型进行查询
该系统的设计是为了每个月左右都会添加请求类型,最终可能会有几百种不同的类型。我想用给定的参数动态搜索一组特定类型。元数据只是一个字段,所以只要它被索引,您就可以查询它 内置索引Raven/DocumentsByEntityName如下所示:
public class BaseRequest
{
public Guid Id { get; set; }
public string RequestName { get; set; }
public DateTime RequiredDate { get; set; }
}
public class RequestA: BaseRequest
{
public string SomethingForA { get; set; }
}
public class RequestB : BaseRequest
{
public int SomethingForB { get; set; }
}
public class AllRequests: AbstractMultiMapIndexCreationTask
{
public AllRequests()
{
AddMap<RequestA>(requests => from req in requests select new {req.RequestName, req.RequiredDate});
AddMap<RequestB>(requests => from req in requests select new {req.RequestName, req.RequiredDate });
}
}
public BaseRequest[] Search(string requestType, string requestName, DateTime? requestDate = null) {
var q = RavenSession.Query<BaseRequest, AllRequests>();
if (!string.IsNullOrEmpty(requestName)) {
q = (IRavenQueryable<BaseRequest>)Queryable.Where(q, x => x.RequestName == requestName);
}
if (requestDate.HasValue) {
q = (IRavenQueryable<BaseRequest>) Queryable.Where(q, x => x.RequiredDate == requestDate);
}
return q.ToArray();
}
database.PutIndex("Raven/DocumentsByEntityName", new IndexDefinition
{
Map =
@"from doc in docs
let Tag = doc[""@metadata""][""Raven-Entity-Name""]
select new { Tag, LastModified = (DateTime)doc[""@metadata""][""Last-Modified""] };",
Indexes =
{
{"Tag", FieldIndexing.NotAnalyzed},
},
Stores =
{
{"Tag", FieldStorage.No},
{"LastModified", FieldStorage.No}
}
});
public BaseRequest[] Search(string requestType, string requestName, DateTime? requestDate = null) {
var q = RavenSession.Query<AllRequests.SearchMap, AllRequests>();
if (!string.IsNullOrEmpty(requestName)) {
q = (IRavenQueryable<BaseRequest>)Queryable.Where(q, x => x.RequestName == requestName);
}
if (requestDate.HasValue) {
q = (IRavenQueryable<BaseRequest>) Queryable.Where(q, x => x.RequiredDate == requestDate);
}
if (!string.IsNullOrEmpty(requestType))
{
q =
q.Where(
x =>
x.RequestType == GetClrTypeFromPassedInValue(requestType));
}
return q.As<BaseRequest>().ToArray();
}
然后,您可以这样查询它:
var results = s.Advanced.LuceneQuery<RequestB>()
.WhereEquals("Tag", "Entity-Name")
.ToArray();
var results=s.Advanced.LuceneQuery()
.WhereEquals(“标记”、“实体名称”)
.ToArray();
解决了这个问题。我需要使用MetadataFor(req)
将clr类型添加到索引中,然后使用特定的映射类型进行查询。像这样:
public class AllRequests: AbstractMultiMapIndexCreationTask
{
public class SearchMap {
public string RequestName{get;set;}
public DateTime RequiredDate{get;set;}
public string RequestType{get;set;}
}
public AllRequests(){
AddMap<RequestA>(requests => from req in requests select new {req.RequestName, req.RequiredDate, RequestType = MetadataFor(req)["Raven-Clr-Type"]});
AddMap<RequestB>(requests => from req in requests select new {req.RequestName, req.RequiredDate, RequestType = MetadataFor(req)["Raven-Clr-Type"] });
}
}
public类所有请求:AbstractMultiMapIndexCreationTask
{
公共类搜索地图{
公共字符串RequestName{get;set;}
所需公共日期时间日期{get;set;}
公共字符串请求类型{get;set;}
}
公共所有请求(){
AddMap(requests=>from请求中的req选择新的{req.RequestName,req.RequiredDate,RequestType=MetadataFor(req)[“Raven Clr Type”]});
AddMap(requests=>from请求中的req选择新的{req.RequestName,req.RequiredDate,RequestType=MetadataFor(req)[“Raven Clr Type”]});
}
}
然后,我可以查询请求的实际字段,也可以按如下类型进行查询:
public class BaseRequest
{
public Guid Id { get; set; }
public string RequestName { get; set; }
public DateTime RequiredDate { get; set; }
}
public class RequestA: BaseRequest
{
public string SomethingForA { get; set; }
}
public class RequestB : BaseRequest
{
public int SomethingForB { get; set; }
}
public class AllRequests: AbstractMultiMapIndexCreationTask
{
public AllRequests()
{
AddMap<RequestA>(requests => from req in requests select new {req.RequestName, req.RequiredDate});
AddMap<RequestB>(requests => from req in requests select new {req.RequestName, req.RequiredDate });
}
}
public BaseRequest[] Search(string requestType, string requestName, DateTime? requestDate = null) {
var q = RavenSession.Query<BaseRequest, AllRequests>();
if (!string.IsNullOrEmpty(requestName)) {
q = (IRavenQueryable<BaseRequest>)Queryable.Where(q, x => x.RequestName == requestName);
}
if (requestDate.HasValue) {
q = (IRavenQueryable<BaseRequest>) Queryable.Where(q, x => x.RequiredDate == requestDate);
}
return q.ToArray();
}
database.PutIndex("Raven/DocumentsByEntityName", new IndexDefinition
{
Map =
@"from doc in docs
let Tag = doc[""@metadata""][""Raven-Entity-Name""]
select new { Tag, LastModified = (DateTime)doc[""@metadata""][""Last-Modified""] };",
Indexes =
{
{"Tag", FieldIndexing.NotAnalyzed},
},
Stores =
{
{"Tag", FieldStorage.No},
{"LastModified", FieldStorage.No}
}
});
public BaseRequest[] Search(string requestType, string requestName, DateTime? requestDate = null) {
var q = RavenSession.Query<AllRequests.SearchMap, AllRequests>();
if (!string.IsNullOrEmpty(requestName)) {
q = (IRavenQueryable<BaseRequest>)Queryable.Where(q, x => x.RequestName == requestName);
}
if (requestDate.HasValue) {
q = (IRavenQueryable<BaseRequest>) Queryable.Where(q, x => x.RequiredDate == requestDate);
}
if (!string.IsNullOrEmpty(requestType))
{
q =
q.Where(
x =>
x.RequestType == GetClrTypeFromPassedInValue(requestType));
}
return q.As<BaseRequest>().ToArray();
}
public BaseRequest[]搜索(字符串requestType,字符串requestName,DateTime?requestDate=null){
var q=RavenSession.Query();
如果(!string.IsNullOrEmpty(requestName)){
q=(IRavenQueryable)Queryable.Where(q,x=>x.RequestName==RequestName);
}
if(requestDate.HasValue){
q=(IRavenQueryable)Queryable.Where(q,x=>x.RequiredDate==requestDate);
}
如果(!string.IsNullOrEmpty(requestType))
{
q=
q、 在哪里(
x=>
x、 RequestType==GetClrTypeFromPassedValue(RequestType));
}
返回q.As().ToArray();
}
是的,我知道-但我想做的是将其添加到我现有的强类型索引中。我找不到办法。如果我真的需要走LuceneQuery路线,那么我会的,但这不是我的首选解决方案。