2013-12-17 167 views
2

我嘗試一個SQLLINQ查詢轉換爲RavenDBLINQ查詢,但它說,塔不能用戶GROUPBY在ravendb 我有很多搜索並找到方法命名爲MAPREDUCERavenDB使用GROUPBY但無法理解如何使用它,我知道我的問題可能是一個重複的問題,但無法找到解決辦法,所以我必須張貼在SO 這裏是我的查詢SQL的LINQ查詢轉換爲RavenDB的LINQ查詢

var rslt = Session.Query<Models.Calendar>() 
.Where(s => s.Start >= fromDate && System.Data.Objects.EntityFunctions.AddMinutes(s.Start, s.Duration) <= toDate) 
.GroupBy(s => System.Data.Objects.EntityFunctions.TruncateTime(s.Start)) 
.Select(x => new { DateTimeScheduled = x.Key, Count = x.Count() }); 

幫我在轉換是

+0

對於RavenDB的建模與關係數據庫非常不同,因此它不僅僅是使一個查詢正常工作。 – synhershko

回答

1

假設你的模型看起來是這樣的:

public class Calendar 
{ 
    public string Id {get; set;} 
    public DateTime Start {get; set;} 
    public int Duration {get; set;} 
} 

首先,你需要定義一個類型爲你想要的結果:

public class CalendarResult 
{ 
    public DateTime Date { get; set; } 
    public int Count { get; set; } 
} 

然後你就可以建立一個地圖,減少指數是這樣的:

public class CalendarsByDate : AbstractIndexCreationTask<Calendar, CalendarResult> 
{ 
    public CalendarsByDate() 
    { 
     Map = calendars => from calendar in calendars 
      select new 
        { 
         calendar.Start.Date, 
         Count = 1 
        }; 

     Reduce = results => from result in results 
      group result by result.Date 
      into g 
      select new 
        { 
         Date = g.Key, 
         Count = g.Sum(x => x.Count) 
        }; 
    } 
} 

它添加到你的數據庫是這樣的:

documentStore.ExecuteIndex(new CalendarsByDate()); 

或者,如果你在你的應用多項指標,你可能更喜歡掃描他們喜歡這個:

IndexCreation.CreateIndexes(GetType().Assembly, documentStore); 

最後,您可以查詢這樣的指標:

var results = session.Query<CalendarResult, CalendarsByDate>() 
        .Where(x => x.Date >= fromDate && x.Date <= toDate); 

您可以閱讀更多關於地圖縮小索引herehere。有關他們如何在內部工作的詳細說明here

有一點需要注意 - 我沒有像在原始查詢中那樣在邏輯中涉及每個項目的持續時間。如果你真的想通過你在這裏做的事情,你會發現你並沒有真正使用它。唯一重要的是如果您的日曆活動可能會跨越多天,在這種情況下,您在EF或Raven表單中有更多工作要做。