2017-11-29 5 views
0

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?

+0

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

Antwort

0

Ich habe es herausgefunden!

begann ich http://briannoyesblog.azurewebsites.net/2014/02/13/passing-complex-query-parameters-with-breeze/

Lesen Dieser führte mich eine Brise Abfrage zu erstellen, die einen Parameter des Entity nimmt ich abrufen möchten:

[HttpGet] 
    [EnableBreezeQuery] 
    public User UserOderSet(Guid guid) 
    {       
     User user = _efContext.Context.UserSet.Where(u => u.guid == guid).Single(); 
     List<Order> orders = _efContext.Context.OrderSet.Where(o => o.user_guid == guid && o.active).ToList(); 

     return user; 
    } 

Notiere die Brise Methode ist eine Einheit der Rückkehr kein IQueryable <>. Das war der Schlüssel. Wenn Sie die EF-Abfrage mit einer Filterbedingung einfach ausführen, werden diese aktiven Aufträge der Auflistungseigenschaft User.Orders zugeordnet.

Client-Site Ich werde diese Methode einfach direkt aufrufen und brauche keine zweite Abfrage, um 'aktive' Aufträge zu laden.

Ich hoffe, das hilft jemandem in der Zukunft.

BTW je mehr ich BreezeJS verwende, desto mehr liebe ich es. Mein Hut ist für ihre hervorragende Arbeit im Team!

Thanks again,

Mike

Verwandte Themen