Polymorphism RavenDb中多映射索引的Clr类型筛选

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

我将所有继承自基类的对象存储在RavenDb中,并使用多映射索引搜索所有子类型,如下所示:

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路线,那么我会的,但这不是我的首选解决方案。