我是RavenDB的新手,我正试图用下面的索引查询下面的文档模型。索引几乎按预期工作,除了现在我只需要在总数中包含日期的最近状态。例如,对于一个日期,客户端可以有多个导入状态,但是只有最后一个状态应该被计算在结果总数中。
public class Client
{
public int Id { get; set; }
public string Name { get; set; }
public IList<ImportStatusMessage> ImportStatuses { get; set; }
}
public class ImportStatusMessage
{
public DateTime TimeStamp { get; set; }
public ImportStatus Status { get; set; }
}
public enum ImportStatus
{
Complete,
Running,
Failed,
Waiting,
NoReport
}
我使用以下索引:
public class Client_ImportSummaryByDate : AbstractIndexCreationTask<Client, ImportSummary>
{
public Client_ImportSummaryByDate()
{
Map = clients => from client in clients
from status in client.ImportStatuses
select new
{
status.Status,
Date = status.TimeStamp.Date,
Count = 1
};
Reduce = results => from result in results
group result by new { result.Status, result.Date }
into g
select new
{
g.Key.Status,
g.Key.Date,
Count = g.Sum(x => x.Count)
};
}
}
public class ImportSummary
{
public ImportStatus Status { get; set; }
public DateTime Date { get; set; }
public int Count { get; set; }
}
可以用索引来完成吗?我是否需要一种不同的方法来解决这个问题?
而不是:
from status in client.ImportStatuses
考虑:
let status = client.ImportStatuses.Last()
如果它们在列表中顺序颠倒,您可以这样做:
let status = client.ImportStatuses.OrderBy(x => x.TimeStamp).Last()
你也可以用First
代替Last
,如果它们是这样排列的。
这些方法中的任何一个都只能索引每个客户端的单个状态。相反,如果您想要多个状态,但只需要给定日期的最后一个状态,则可以这样做:
Map = clients => clients.SelectMany(x => x.ImportStatuses, (x, y) => new {x.Id, y.Status, y.TimeStamp})
.GroupBy(x => new {x.Id, x.TimeStamp.Date})
.Select(g => g.OrderBy(x => x.TimeStamp).Last())
.Select(x => new
{
x.Status,
x.TimeStamp.Date,
Count = 1
});
所有这些都将在索引的map部分,因为列表在每个文档中都是自包含的。