2017-04-26 12 views
0

私はコードを簡素化し、コンパクト化し、できるだけコードの重複を排除しようとしています。私はRavenDBコレクションを照会するメソッドを持っており、照会は照会しようとしているタイプに適応する必要があります。この型は、メソッドに渡されるパラメータに応じて変化し、where節も適応する必要があります。 私は基本タイプAdministrativeAreaを持っていますが、他のタイプはLevel1_AdministrativeAreasからLevel5_AdministrativeAreasに派生しています。シナリオに応じて、私はなど、Level1_AdministrativeAreas、AdministrativeAreasを照会する必要がRavenDBクエリの動的パラメータを使用

私が現在持っている:

private void Merge(MergeLevel currentMergeLevel, IDocumentSession currentSession) 
    { 
    (...) 
IQueryable<AdministrativeArea> query; 
    if (currentMergeLevel == MergeLevel.Level1) 
     query = currentSession.Query<AdministrativeArea, AdminAreaName>() 
     .Where(area => !string.IsNullOrEmpty(area.NAME_0) && !string.IsNullOrEmpty(area.NAME_1)); 
    (...) 
    } 

すると、メソッドのパラメータとしてタイプに渡し、それらを持ってする方法はありますに適用されますこのようなクエリ、:私はコンパイル時にいくつかの問題に直面している

private void Merge(MergeLevel currentMergeLevel, IDocumentSession currentSession, Type requiredType, Type indexType) 
    { 
     (...) 
    IQueryable<requiredType> query; 
     if (currentMergeLevel == MergeLevel.Level1) 
      query = currentSession.Query<requiredType, indexType>() 
      .Where(area => !string.IsNullOrEmpty(area.NAME_0) && !string.IsNullOrEmpty(area.NAME_1)); 
     (...) 
     } 

は、つまり「変数であるが、タイプのように使用されている」と、実際にそのメンバ変数(NAME_0、NAME_1、など)することができます」コンパイラは「何が来るのか」を知らないので推論することはできません。 私はこれが単にできないと思う。しかし、これはコードのメンテナンスに影響します。それぞれのタイプのクエリに対して異なるメソッドを作成するか、かなり大きなメソッドを作成する必要があります。いずれもあまりにも魅力的ではありませんが、私はそれを回避する方法を見ません。

+1

これはあまり明確ではありませんが、ジェネリックで試してみてください:void Merge (int currentMergeLevel 、IDocumentSession currentSession) – Embri

答えて

0

タイプ別フィルタリングの良い方法は、インデックスの "select"句にRaven-Entity-Nameフィールドを含めることです。 次に、EntityTypeフィールドを使用して型をフィルタ処理できます。これがうまくいくことを

from doc in docs 
let entityType = doc["@metadata"]["Raven-Entity-Name"] 
where entityType.EndsWith("_AdministrativeAreas") 
select new 
{ 
    EntityType = entityType, 
    //the rest of the fields 
} 

は注意:内蔵のレイヴン/ DocumentsByEntityNameインデックス

そうでインデックスのこの種の例を見ることができます に、あなたのインデックスは次のようになります既存のクライアントAPIを介してドキュメントを挿入している場合(raw REST APIはそれ自体のRaven-Entity-Nameを追加しません)

+0

マイケル、それは興味深いアプローチです - 私はそれを考えていませんでした!私はジェネリック医薬品に精通していたので、私の問題の解決策を提供することが判明しました。私はあなたの提案されたアプローチで周りに遊びます。ありがとうございました ! –

関連する問題