如何在RavenDB索引中使用逻辑检查派生类型?

时间:2017-12-04 18:27:57

标签: c# ravendb

我需要根据PriceSetup的类型在索引中存储不同的值。

我试过下面的代码。

我已经尝试过完全符合条件的类名。

在这两种情况下,当我尝试创建索引时,RavenDB告诉我找不到类型FixedPriceSetup

如何根据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类非常复杂,在这种情况下intellisense是一种祝福。

编辑: 代码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 个答案:

答案 0 :(得分:1)

服务器上不存在类型,这就是您收到此错误的原因。 但是,这是一个使用多地图的好地方。 https://ravendb.net/docs/article-page/3.5/Csharp/indexes/multi-map-indexes