.net 从RavenDB索引中的集合检索特定类型的项的总和

.net 从RavenDB索引中的集合检索特定类型的项的总和,.net,mapreduce,ravendb,.net,Mapreduce,Ravendb,我正在尝试创建一个索引,其类和索引定义与下面所示的类似: 公共类Foo { 公共字符串标记{get;set;} 公共列表栏{get;set;} } 公共抽象类栏 { 公共整数权重{get;set;} } 公共类铁棒:棒{} 公营巧克力吧{} 公共类标记摘要 { 公共字符串标记{get;set;} 公共整数计数{get;set;} public int TotalChocolateBarWeight{get;set;} 公共整数TotalIronBarWeight{get;set;} } 公共类标

我正在尝试创建一个索引,其类和索引定义与下面所示的类似:

公共类Foo
{
公共字符串标记{get;set;}
公共列表栏{get;set;}
}
公共抽象类栏
{
公共整数权重{get;set;}
}
公共类铁棒:棒{}
公营巧克力吧{}
公共类标记摘要
{
公共字符串标记{get;set;}
公共整数计数{get;set;}
public int TotalChocolateBarWeight{get;set;}
公共整数TotalIronBarWeight{get;set;}
}
公共类标记摘要索引:AbstractIndexCreationTask
{
公共标记摘要索引()
{
Map=foos=>来自foos中的f
选择新的
{
标签=f.标签,
计数=1,
巧克力总重量=f.bar.OfType().Sum(x=>x.Weight),
TotalIronBarWeight=f.Bars.OfType().Sum(x=>x.Weight)
};
Reduce=结果=>来自结果中的r
按r分组。标记为g
选择新的
{
标记=g.键,
Count=g.Sum(x=>x.Count),
巧克力总重量=g.总和(x=>x.巧克力总重量),
总IronBarweight=g.Sum(x=>x.TotalIronBarWeight)
};
}
}
但是,当我尝试创建索引时

IndexCreation.CreateIndexes(this.GetType().Assembly, _documentStore);
它抛出一个InvalidOperation异常。如果我从
Map
中删除
.OfType()
部分,那么一切都很好(但不是我想要的)。我尝试过使用
其中(x=>x是巧克力条)
和各种其他类型的检查选项,但没有效果

我将如何实现这一目标


谢谢

也许你能做的最简单的事情就是在类中添加一些属性来预先计算小计

public class Foo
{
    public string Tag { get; set; }
    public List<Bar> Bars { get; set; }
    public int ChocolateBarsWeight
    {
        get
        {
            return Bars.OfType<ChocolateBar>().Sum(x => x.Weight);
        }
    }
    public int IronBarsWeight
    {
        get
        {
            return Bars.OfType<IronBar>().Sum(x => x.Weight);
        }
    }
}
然而,我倾向于同意在这种情况下,
.OfType()
应该起作用,但事实并非如此。原因是类型信息被序列化为json中的
$type
值。每当存储抽象基类型或接口时,都会发生这种情况。例如:

{
    "Tag": "A",
    "Bars": [
        {
            "$type": "YourNameSpace.ChocolateBar, YourNameSpace",
            "Weight": 10
        },
        {
            "$type": "YourNameSpace.IronBar, YourNameSpace",
            "Weight": 1000
        }
    ]
}

Raven应该能够了解这一点并正确处理
.OfType()
。我会在下一个主要版本中推荐它。

谢谢Matt,是的,这对我来说是一个方便的功能。我将暂时计算它们。
{
    "Tag": "A",
    "Bars": [
        {
            "$type": "YourNameSpace.ChocolateBar, YourNameSpace",
            "Weight": 10
        },
        {
            "$type": "YourNameSpace.IronBar, YourNameSpace",
            "Weight": 1000
        }
    ]
}