Conversión de consulta SQL Linq en consulta RavenDB Linq

Estoy intentando convertir una consulta SQL LINQ en la consulta RavenDB LINQ pero dice que no puede agrupar al usuario en ravendb He buscado mucho y encuentro un método llamado MAPREDUCE para usar groupby en RavenDB pero no puedo entender cómo usarlo. Sé que mi pregunta puede ser una pregunta duplicada pero no puedo encontrar una solución, así que tiene que publicarlo en SO aquí está mi consulta

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

ayúdame a convertir eso

0
Modelar para RavenDB es muy diferente que para DB relacionales, y como tal no se trata solo de hacer que una consulta funcione.
agregado el autor synhershko, fuente

1 Respuestas

Suponiendo que su modelo se ve así:

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

Primero definiría un tipo para los resultados que desea:

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

Entonces puedes construir un índice map-reduce como este:

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

Agregue eso a su base de datos de esta manera:

documentStore.ExecuteIndex(new CalendarsByDate());

O si tiene muchos índices en su aplicación, puede preferir escanearlos de esta manera:

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

Entonces, finalmente, puede consultar el índice de esta manera:

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

Puede leer más sobre los índices map-reduce aquí y aquí . Hay una explicación detallada de cómo funcionan internamente aquí .

Una cosa a tener en cuenta: no involucré la duración de cada elemento en esta lógica como lo hizo en la consulta original. Si realmente piensas lo que estás haciendo aquí, verás que en realidad no lo estás usando de todos modos. El único lugar en el que importaría es si los eventos de su calendario pueden abarcar varios días, en cuyo caso tendrá mucho más trabajo que hacer en los formularios EF o Raven.

0
agregado