2017-12-04 12 views
1

PriceSetupのタイプに基づいて異なる値をインデックスに格納する必要があります。RavenDBインデックスの派生型の論理チェックを使用するにはどうすればよいですか?

私は以下のコードを試しています。

私はalosが完全修飾クラス名を指定しようとしました。

どちらの場合も、インデックスを作成しようとすると、FixedPriceSetupというタイプが見つからないことがRavenDBによってわかります。

PriceSetupの種類に基づいてインデックスに異なる値を保存するにはどうすればよいですか?

public class Trade 
{ 
    public PriceSetup PriceSetup; 
} 

public abstract class PriceSetup 
{ 
    public int TotalPrice; 
} 

public class FixedPriceSetup : PriceSetup 
{ 
    public int DailyPrice; 
} 

public class FlexiblePriceSetup : PriceSetup 
{ 
    //...some other stuff 
} 

public class TradeSearchIndex : AbstractIndexCreationTask<Trade> 
{ 
    public TradeSearchIndex() 
    { 
     Map = trades => 
      from trade in trades 
      select new 
      { 
       TotalPrice = trade.PriceSetup is FixedPriceSetup 
        ? Math.Abs(trade.PriceSetup.TotalPrice) * Math.Sign((trade.PriceSetup as FixedPriceSetup).DailyPrice) 
        : trade.PriceSetup.TotalPrice 
      } 
    } 
} 

Tradeクラスは非常に複雑であり、インテリセンスが、この場合は祝福ですので、私はコード内のインデックス定義を維持したいと思います。

編集: コードbeloewが動作しているようです:

public class TradeSearchIndex : AbstractIndexCreationTask<Trade> 
{ 
    public TradeSearchIndex() 
    { 
     Map = trades => 
      from trade in trades 
      select new 
      { 
       TotalPrice = 
        AsDocument(trade.PriceSetup)["$type"].ToString() == "RavenTest.FixedPriceSetup, RavenTest" 
         ? Math.Abs(trade.PriceSetup.TotalPrice) * Math.Sign(AsDocument(trade.PriceSetup)["DailyPrice"].Value<int>) 
         : trade.PriceSetup.TotalPrice 
      } 
    } 
} 

答えて

1

タイプは、このエラーが発生した理由である、サーバー上に存在しません。 しかし、これはマルチマップを使用するには本当に良い場所です。 https://ravendb.net/docs/article-page/3.5/Csharp/indexes/multi-map-indexes

+0

共有したリンクのマルチマップの例は、さまざまなコラボレーションのマルチマップインデックスを作成する方法を示しています。私の場合、すべての文書は「貿易」タイプの同じコラプションにあります。私はマルチマップが私のインデックス定義で 'trade.PriceSetup.DailyPrice'を使うことができないということを、どのようにして解決するのか分かりません。 – inwenis

+0

私が提供した編集を見て、これがうまくいくか、これが完全な間違っているかを教えてください。 – inwenis

+0

メタデータプロパティー 'Raven-Clr-Type'に基づいて同じコレクションを繰り返し、フィルタリングすることができます –

関連する問題