gpt4 book ai didi

polymorphism - 在 RavenDb 中的多 map 索引上按 Clr-Type 过滤

转载 作者:行者123 更新时间:2023-12-03 16:56:21 24 4
gpt4 key购买 nike

我在 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();
}

我想做的是通过请求的 CLR-Type 进一步过滤结果。是否可以使用“Raven-Entity-Name”元数据字段执行此操作,如果可以,如何执行?

我知道我可以使用 Query<RequestA>()等等,但我以后可能需要按多种类型进行过滤,这些类型将由用户动态选择。

注意:我真正想做的是使用索引来拉回给定某个 RequestName 的请求,但只返回 RequestA(后来只返回 RequestA、RequestC 和 RequestD)。我不想做多个查询来分别取回每种类型,我想做一个通过参数查询并有时键入的查询。

该系统的设计目的是每个月左右都会添加请求类型,我们最终可能会得到几百种不同的类型。我想动态搜索一组具有给定参数的特定类型。

最佳答案

解决了。我需要使用 MetadataFor(req)将 clr 类型添加到索引,然后使用特定的 map 类型进行查询。像这样:

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 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();
}

关于polymorphism - 在 RavenDb 中的多 map 索引上按 Clr-Type 过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10700979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com