SQL Linq查询转换为RavenDB Linq查询

时间:2013-12-17 08:06:21

标签: mapreduce ravendb

我正在尝试将SQL LINQ个查询转换为RavenDB LINQ个查询,但它表示不能在ravendb中使用groupby 我已经搜索了很多并找到名为MAPREDUCE的方法在RavenDB中使用groupby但是无法理解如何使用它我知道我的问题可能是一个重复的问题但是无法找到解决方案所以我必须将其发布在{ {1}} 这是我的查询

SO

帮助我转换

1 个答案:

答案 0 :(得分: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; }
}

然后你可以像这样建立一个map-reduce索引:

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

您可以阅读有关map-reduce indices herehere的更多信息。有关它们如何在内部工作的详细说明here

有一点需要注意 - 我没有像在原始查询中那样涉及此逻辑中每个项目的持续时间。如果你真的想过你在这里做的事情,你会发现你并没有真正使用它。唯一重要的是,如果您的日历活动可能跨越多天,在这种情况下,您需要在EF或Raven表单中完成更多工作。