2013-04-03 102 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