2012-10-31 4 views
6

Ich versuche, RavenDB auf eine Datetime abzufragen, die durch einen Eintrag in einer Sammlung versetzt wird. Wie unten gezeigt, habe ich ein AppointmentReminder-Objekt, das viele AppointmentReminderJobs enthält. Ich möchte nach AppointmentReminders fragen, wo der AppointmentReminderJob ausgeführt werden soll.RavenDB Abfrage auf Datetime mit Wert im Sammlungsoffset

Meine Modelle sind wie folgt:

public class AppointmentReminder 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Email { get; set; } 
    public string Phone { get; set; } 
    public DateTime AppointmentDateTime { get; set; } 
    public ReminderStatus ReminderStatus { get; set; } 
    public List<AppointmentReminderJob> AppointmentReminderJobs { get; set; } 
} 

public class AppointmentReminderJob 
{ 
    public JobStatus JobStatus { get; set; } 
    public int DaysPrior { get; set; } 
} 

Mein Controller und Versuch, eine Liste von AppointmentReminders abzurufen, die aktuellen Aufträge laufen müssen (das weiß ich Where-Klausel nicht abgeschlossen ist, aber ich habe versucht, vereinfachen es ohne Glück):

public ActionResult GetJobsQueuedListCurrent() 
    { 
     var jobsqueuedlist = RavenSession.Query<AppointmentReminder>() 
      .Where(appointmentreminder => appointmentreminder.AppointmentReminderJobs.Any(x => appointmentreminder.AppointmentDateTime < DateTime.Now.AddDays(x.DaysPrior))) 
      .OrderBy(appointmentreminder => appointmentreminder.AppointmentDateTime) 
      .Take(20) 
      .ToList(); 

     return View("List", jobsqueuedlist); 

    } 

Aufruf der oben eine Antwort von ergibt:

variable 'x' of type 'ProjectName.Models.AppointmentReminderJob' referenced from scope '', but it is not defined 

Ich versuche, einen Index zu gründen wie so:

public class JobsQueuedListCurrent : AbstractIndexCreationTask<AppointmentReminder, JobsQueuedListCurrent.IndexResult> 
{ 
    public class IndexResult 
    { 
     public int Id { get; set; } 
     public DateTime JobDateTime { get; set; } 
    } 

    public JobsQueuedListCurrent() 
    { 


     Map = appointmentreminders => from appointmentreminder in appointmentreminders 
             from job in appointmentreminder.AppointmentReminderJobs 
             select new 
             { 
              Id = appointmentreminder.Id, 
              JobDateTime = appointmentreminder.AppointmentDateTime.AddDays(job.DaysPrior) 
             }; 
     Store(x => x.Id, FieldStorage.Yes); 
     Store(x => x.JobDateTime, FieldStorage.Yes); 
    } 
} 

Nun, ich abfragt und die erwarteten Ergebnisse erhalten mit:

var jobsqueuedlist = RavenSession.Query<JobsQueuedListCurrent.IndexResult, JobsQueuedListCurrent>() 
      .Where(x=>x.JobDateTime >= DateTime.Now) 
      .As<AppointmentReminder>() 
      .Take(20) 
      .ToList(); 

     return View("List", jobsqueuedlist); 

Meine letzte Frage in Bezug auf diese wäre, meine Karte/index kann definitiv zu mehreren Einträgen derselben Dokumenten-ID führen (terminerreminder), aber meine resultierende Liste enthält nur 1 Instanz des Dokuments. Ich bin glücklich mit der Art und Weise, die funktioniert, ich bin mir nur nicht sicher, ob ich etwas reduzieren oder etwas anderes in meinem Code machen soll oder ob Raven einfach so damit umgehen soll, als ob es so läuft.

Antwort

4

Sie können eine solche Abfrage nicht erstellen. Dies würde erfordern, dass RavenDB während der Abfrage Berechnungen durchführt, und das ist nicht erlaubt. RavenDB erlaubt nur Abfragen der Daten im Index.

Was Sie können tun es im Index die Berechnung Setup und dann abfragen auf dass.

+0

Danke! Du hast mich in die richtige Richtung weisen lassen. Ich habe meine Frage oben mit dem Code bearbeitet, mit dem ich gearbeitet habe. Ich fügte eine Frage zu Best Practices hinzu, ich hatte nicht erwartet, dass Raven nur eine Instanz meines Dokuments zurückgeben würde, obwohl mein Index mehrere Einträge hatte, die mit der WHERE-Klausel übereinstimmten und alle auf dasselbe Dokument verweisen. Ich bin mir nicht sicher, ob ich irgendetwas anderes tun sollte, um zu helfen, oder lasse Raven einfach weiter damit umgehen, nur eine Instanz jedes Dokuments zurückzugeben. – mcbowes