RavenDB查询子集合多态性

时间:2017-09-05 07:43:38

标签: c# ravendb nosql

我在RavenDB中有一个包含子集合的文档。子集合包含以下基本类型。

public class Section
{
    public string BackgroundColor { get; set; }
    public string Description { get; set; }
    public string DesktopBackgroundImageUrl { get; set; }
    public DateTime? EndDate { get; set; }
    public string MobileBackgroundImageUrl { get; set; }
    public int SortOrder { get; set; }
    public DateTime? StartDate { get; set; }
    public string TextColor { get; set; }
    public string Title { get; set; }
    public SectionType Type { get; set; }
}

这种类型有一些派生类,其中一个就是这个。

public class OfferSection : Section
{
    public IEnumerable<Merchant> Merchants { get; set; }
}

我遇到的问题是我需要查询这个子集合并获取包含派生类型的文档,然后查询它的值。

这是我到目前为止所处的位置,但是因为它使用的是基类型,Merchants属性不存在

public class Hubs_ByMerchantId : AbstractIndexCreationTask<Hub>
{
    public Hubs_ByMerchantId()
    {
        Map = hubs => from hub in hubs
            select new
            {
                Sections_Merchants_Id = hub.Sections.Where(x => x.Type == SectionType.Offer).SelectMany(x => x.Merchants.Select(y => y.Id))
            };
    }
}

有人能指出我正确的方向吗?

由于

2 个答案:

答案 0 :(得分:0)

您可以使用.OfType<Type>获取您想要的内容:

hub.Sections.OfType<OfferSection>().SelectMany(x => x.Merchants.Select(y => y.Id));

答案 1 :(得分:0)

在让我开始工作的方式有些混乱之后,将它放入选择中。这很有效,因为我们已经有一个针对该部分保存的类型枚举,因此很容易进行转换。

public class Hubs_ByMerchantId : AbstractIndexCreationTask<Hub>
{
    public Hubs_ByMerchantId()
    {
        Map = hubs => hubs.SelectMany(x => (IEnumerable<OfferSection>)x.Sections).Where(x => x.Type == SectionType.Offer).Select(x => new
        {
            Sections_Merchants_Id = x.Merchants.Select(y => y.Id)
        });
    }
}

这可能不是最好的解决方案,但它是唯一有效的方法