すべて基本クラスから継承するオブジェクトを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タイプで結果をさらにフィルタリングすることです。「Raven-Entity-Name」メタデータフィールドを使用してこれを行うことは可能ですか?その場合、どのように行いますか?
などを使用できることはわかってQuery<RequestA>()
いますが、後日、複数のタイプでフィルタリングする必要があり、これらのタイプはユーザーによって動的に選択されます。
注:私が本当にやりたいのは、インデックスを使用して、特定のRequestNameが指定されたリクエストをプルバックすることですが、RequestAのみ(後でRequestA、RequestC、およびRequestDのみ)を返します。各タイプを個別に取得するために複数のクエリを実行したくはありません。パラメータによってクエリを実行し、場合によってはタイプする1つのクエリを実行したいと思います。
システムは、リクエストタイプが毎月追加されるように設計されており、おそらく数百の異なるタイプになるでしょう。指定されたパラメータを使用して、特定のタイプのセットを動的に検索したいと思います。