Ich habe einen Benutzer, der Aufträge hat. Ich möchte den Benutzer auswählen und Aufträge erweitern, um nur Orders.valid == true
einzuschließen. Etwas wie folgt aus:Breeze Abfrage, um gefilterte verwandte Entitäten zu enthalten
// This is just a pseudo-query of what I want to achieve
// Note singluar 'Order.valid' also does not work
let query= new Predicate('guid', 'eq', this.user.guid).and(new Predicate('Orders.valid', 'eq', 'true');\
let users= this.uow.userSet.where(query, ['Orders']);
Die where()
Methode aus dem TempHire Repository entnommen und modifiziert, um ein wenig:
where(predicate: Predicate, expand: string[] = null): Promise<any[] | Entity[]> {
return new Promise<any[] | Entity[]>((resolve) => {
let query = this.baseQuery().where(predicate)
if(expand) query = query.expand(expand);
Die obige Abfrage nicht als funktioniert, wo Zustand nicht auf eine Entity Eigenschaft angewendet werden kann, dass ist eine Sammlung.
Um dies auf der Client-Seite zu lösen, habe ich einfach zwei Abfragen implementiert, eine, die den Benutzer abruft und eine zweite, die die gültigen Benutzerabfragen abruft. Ich würde es vorziehen, dies eine einzige Abfrage zu machen.
Ich habe auch versucht, dies auf der Serverseite zu lösen. Ich benutze einen [BreezeController], der eine Breeze EFContextProvider<>
darstellt, die wiederum der TempHire-Methode folgt, die jede Entitätssammlung als IQueryable<>
verfügbar macht. Innerhalb OrderSet()
habe ich versucht, den folgenden Code:
return _efContext.Context.OrderSet.Where(o => o.valid);
Allerdings ist es nicht das scheint, wenn eine Abfrage direkt an die UserSet()
Brise gesendet wird, wird die freigelegte OrderSet()
Methode verwenden, um den Orders
Eigenschaft des Benutzers zu erweitern.
Ich dachte über die Orders
Eigenschaft direkt im UserSet()
Erweiterung enthalten immer gültige Orders (mit Linq), aber ich weiß nicht immer wollen Orders
für jede Abfrage zu UserSet
zurückgekehrt und ich bin nicht sicher, ob BreezeController werden diese Streifen unerwünschte umfasst.
Gibt es eine bessere/andere Möglichkeit, diese Client- oder Server-Seite zu implementieren, anstatt mehrere Aufrufe an den Server mit individuellen where-Klauseln auf jedem Entity-Set zu tätigen?
Vielleicht sollte ich einen UserOrderSet()
Endpunkt erstellen und diesen direkt aufrufen, wenn ich einen Benutzer mit gültigen Bestellungen haben möchte? Gedanken?
Ich glaube nicht, das alles in einer Abfrage durchgeführt werden kann. Ich habe versucht, es serverseitig direkt über Linq zu tun und die Projektion manuell Bestellungen mit einer Unterabfrage aufzufüllen, aber das scheitert dann mit "Die Entität oder der komplexe Typ 'Model.User' kann nicht in einer LINQ to Entities Query konstruiert werden" – Mike