C# 用于其他计算的RavenDb地图索引

C# 用于其他计算的RavenDb地图索引,c#,asp.net-core,ravendb,C#,Asp.net Core,Ravendb,在开始的时候,我想说的是,我对任何类型的NoSql数据库都是非常陌生的。我想我可能误解了RavenDb中索引的概念 在我的申请书中,我收集了一份代表汽车加油历史的文件(其中包含加油路线的子集合)。简化版本如下所示: public class Fuel { public decimal? VolumeUsed { get; set; } public decimal CostPerLitre { get; set; } public decimal? TotalDistan

在开始的时候,我想说的是,我对任何类型的NoSql数据库都是非常陌生的。我想我可能误解了RavenDb中索引的概念

在我的申请书中,我收集了一份代表汽车加油历史的文件(其中包含加油路线的子集合)。简化版本如下所示:

public class Fuel
{
    public decimal? VolumeUsed { get; set; }
    public decimal CostPerLitre { get; set; }
    public decimal? TotalDistance { get; set; }
    public IList<Route> Routes { get; set; }
}

public class Route
{
    public string StartingAddress { get; set; }
    public IList<Stop> Stops { get; set; }
}
和索引定义:

public class FuelCalculatedIndex : AbstractIndexCreationTask<Fuel, FuelCalculated>
{
    public FuelCalculatedIndex()
    {
        Map = fuels =>
            fuels.Select(f => new FuelCalculated()
            {
                AverageFuelConsumption = (f.VolumeUsed * 100) / f.TotalDistance,
                Routes = f.Routes.Select(r => new RouteCalculated()
                {
                    StartingAddress = r.StartingAddress,
                    Stops = r.Stops,
                    TotalDistance = r.Stops.Sum(s => s.Distance),
                    AverageFuelConsumption = r.Stops.Sum(s => s.AverageFuelConsumption * s.Distance) / r.Stops.Sum(s => s.Distance),
                }).ToList(),
                TotalCost = f.VolumeUsed * f.CostPerLitre,
                TotalDistance = f.TotalDistance,
                VolumeUsed = f.VolumeUsed,
            });

        StoreAllFields(FieldStorage.Yes);
    }
}
因此,问题似乎在于C#代码。我做错了什么

更新

我刚刚试着用C#运行原始查询:

等待会话 .Advanced.AsyncRawQuery(“从索引'FuelCalculatedIndex'选择总成本”) .ToListAsync();
令人惊讶的是,它是有效的。

查询的结果总是一个文档(地图索引)。 因此,原始查询实际上应该是:

using (var session = documentStore.OpenAsyncSession())
{
    return await session
        .Query<FuelCalculated, FuelCalculatedIndex>()
        .As<Fuel>
        .ToListAsync();
}
使用(var session=documentStore.OpenAsyncSession())
{
返回等待会话
.Query()
.作为
.ToListAsync();
}
您需要使用ProjectInto来获取存储的字段:

using (var session = documentStore.OpenAsyncSession())
{
    return await session
        .Query<FuelCalculated, FuelCalculatedIndex>()
        .ProjectInto<FuelCalculated>
        .ToListAsync();
}
使用(var session=documentStore.OpenAsyncSession())
{
返回等待会话
.Query()
.项目
.ToListAsync();
}

我认为将
fuelcomputed
指定为第一个泛型类型就足够了,但我从未真正考虑过投影。谢谢,真是太棒了!
{
   "volumeUsed":28.04,
   "costPerLitre":4.93,
   "totalDistance":467.3,
   "totalCost":null,                       <----
   "averageFuelConsumption":null,          <----
   "routes":[
      {
         "startingAddress":"Address 1",
         "stops":[
            {
               "address":"Address 2",
               "distance":351.0,
               "averageFuelConsumption":6.0
            }
         ],
         "totalDistance":0,                <----
         "totalAverageFuelConsumption":0   <----
      },
      {
         "startingAddress":"Address 3",
         "stops":[
            {
               "address":"Address 4",
               "distance":116.3,
               "averageFuelConsumption":7.0
            }
         ],
         "totalDistance":0,                <----
         "totalAverageFuelConsumption":0   <----
      }
   ]
}
from index 'FuelCalculatedIndex'
select TotalCost
await session
    .Advanced.AsyncRawQuery<FuelCalculated>("from index 'FuelCalculatedIndex' select TotalCost")
    .ToListAsync();
using (var session = documentStore.OpenAsyncSession())
{
    return await session
        .Query<FuelCalculated, FuelCalculatedIndex>()
        .As<Fuel>
        .ToListAsync();
}
using (var session = documentStore.OpenAsyncSession())
{
    return await session
        .Query<FuelCalculated, FuelCalculatedIndex>()
        .ProjectInto<FuelCalculated>
        .ToListAsync();
}