2016-06-14 4 views
0

Hier ist das Setup habe ich ein Objekt bekommt, das wie so eine Liste von Ereignissen enthält:Wie von der Art eines verschachtelten Objekts in RavenDB abfragen

public class Order 
{ 
    public string Name {get; set;} 
    public List<OrderEvent> OrderEvents {get; set;} 
    public bool IsComplete() => OrderEvents.Any(e => e.GetType() == typeof(OrderComplete)); 
} 

public class OrderEvent 
{ 
    public DateTime TimeStamp {get; set;} 
} 

public class OrderSubmitted : OrderEvent {...quantity ect...} 
public class OrderPaidFor : OrderEvent {...amounts...} 
public class OrderComplete : OrderEvent {...more stuff...} 

Jetzt kann ich diese Daten in die Datenbank-Dump und ziehe es raus und alles ist gut, aber wie schreibe ich eine Abfrage, um nur die abgeschlossenen Aufträge zu erhalten, ohne alle Bestellungen auf die Client-Seite zu ziehen und dort zu filtern?

Ich habe die folgende Abfrage versucht, aber mir wurde gesagt, dass ich GetType nicht so übersetzen kann.

Session.Query<Order>() 
     .Where(o => o.Events.Any(e => e.GetType() == typeof(OrderComplete))) 
     .ToList(); 

Ich bin mir ziemlich sicher, dass es ein guter Weg, dies mit JObjects zu tun, und die $ type-Eigenschaft abfragen, aber Google und meine Bemühungen gekommen sind, nicht mit irgendetwas auf gut noch.

Danke.

Antwort

1

Sie können die IsComplete()-Funktion stattdessen als schreibgeschützte Eigenschaft festlegen. Auf diese Weise würde es im gespeicherten Dokument bis IsComplete: true/false serialisieren.

Dann sollten Sie in der Lage, so fragen:

Session.Query<Order>() 
    .Where(o => o.IsComplete) 
    .ToList(); 

hoffe, das hilft!

+1

Dies war nicht die Antwort, die ich erwartet habe, aber man macht den Code einfach zu lesen und zu arbeiten. Manchmal ist die einfache Antwort die beste Antwort. Vielen Dank! – Yojin

Verwandte Themen