SQL Linq Abfragekonvertierung in RavenDB Linq Query

Ich versuche, eine SQL LINQ Abfrage in RavenDB LINQ Abfrage zu konvertieren, aber es sagt, dass Benutzer in robendb Groupby nicht können Ich habe viel gesucht und finde Methode MAPREDUCE um groupby in RavenDB zu verwenden, aber kann nicht verstehen, wie man es benutzt, ich weiß, meine Frage kann eine doppelte Frage sein, kann aber keine Lösung finden muss es auf SO veröffentlichen Hier ist meine Abfrage

var rslt = Session.Query()
.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() });

Hilf mir, das zu konvertieren

0
Das Modellieren für RavenDB unterscheidet sich sehr von dem für relationale DBs und als solches geht es nicht nur darum, dass eine Abfrage funktioniert.
hinzugefügt der Autor synhershko, Quelle

1 Antworten

Angenommen, Ihr Modell sieht ungefähr so ​​aus:

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

Zuerst würden Sie einen Typ für die Ergebnisse definieren, die Sie wollen:

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

Dann können Sie einen Map-Reduce-Index wie folgt erstellen:

public class CalendarsByDate : AbstractIndexCreationTask
{
    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)
                   };
    }
}

Fügen Sie das zu Ihrer Datenbank wie folgt hinzu:

documentStore.ExecuteIndex(new CalendarsByDate());

Wenn Sie viele Indizes in Ihrer App haben, sollten Sie stattdessen lieber nach ihnen suchen:

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

Dann können Sie den Index schließlich wie folgt abfragen:

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

Sie können mehr über Map-Reduce-Indizes lesen hier und hier . Es gibt eine detaillierte Erklärung, wie sie intern hier arbeiten.

Eine Sache zu beachten - Ich habe die Dauer jedes Elements in dieser Logik nicht wie in der ursprünglichen Abfrage einbezogen. Wenn du wirklich darüber nachdenkst, was du hier machst, wirst du feststellen, dass du das sowieso nicht benutzt hast. Der einzige Ort, an dem es wichtig wäre, wäre, wenn Ihre Kalenderereignisse mehrere Tage umfassen könnten. In diesem Fall haben Sie entweder in der EF- oder der Raven-Form viel mehr zu tun.

0
hinzugefügt