2013-04-03 103 views
1

我是新来的RavenDB,我想用下面的索引查询文档模型。该索引几乎按照期望工作,除了现在我只需要包含总数中某个日期的最新状态。例如,客户可能有多个日期的导入状态,但只有最后一个状态应计入结果总数中。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; } 
} 

可以这样使用索引来完成?我需要一种不同的方法来解决这个问题吗?

回答

1

相反的:

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 
            }); 

所有这一切都将在指数的地图部分,由于该表是自足在每个文件中。

+0

我看到你要去哪里,但SelectMany()在添加.Last()后抱怨,因为lambda不再返回IEnumerable。我将SelectMany()转换为Select()并将其编译,但索引不再产生任何结果。 – Brantino 2013-04-03 22:08:01

+0

我会尽快通过测试代码进行更新。快速问题 - 你是否在问题中拼错了名字?你不能有一个名为'ImportStatus'的类和枚举。 – 2013-04-03 22:50:22

+0

是的,我做到了。我刚纠正了问题中的代码。 – Brantino 2013-04-03 23:10:03