2013-04-03 7 views
5

Ich entwickle eine asp.net-Lösung mit Durandal/Brise.Führen Sie eine Auswahl und erweitern Sie in der gleichen Abfrage mit Brise wird nicht unterstützt

Hier ist mein Code alle meine Versendern zu bekommen:

var query = EntityQuery.from('Shippers') 
       .select('id, name, street, city'); 

return manager.executeQuery(query) 
     .then(querySucceeded) 
     .fail(queryFailed); 

Hier ist das zugehörige Modell:

public class Shipper 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Street { get; set; } 
    public string Number { get; set; } 
    public City City { get; set; } 
} 

public class City 
{ 
    public int Id { get; set; }   
    public string Name { get; set; } 
    public string PostCode { get; set; } 
    public Country Country { get; set; } 
} 

Jetzt brauche ich auch Länder einschließen

public class Country 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Code { get; set; } 
    public string Name { get; set; } 
} 

Aber mit die eigentliche Abfrage bekomme ich keine Länder damit.

Ich versuche:

var query = EntityQuery.from('Shippers') 
       .select('id, name, street, city') 
       .expand('City.Country'); 

aber ich habe den Fehler:

use of both 'expand' and 'select' in the same query is not currently supported

Meine Frage: wie die Länder zu bekommen?


UPDATE

Als Jay vorgeschlagen, was wir tun können:

var query = EntityQuery.from('Shippers') 
     .select('id, name, street, city, city.country') 

Nun habe ich ein city_Country Objekt:

enter image description here

ich nicht Versteh warum wir gehen Diese city_Country t weil Länderdaten in der Stadt \ Land Objekt bereits vorhanden sind:

enter image description here

Außerdem gibt es mir Problem, weil meine nächste Anweisung versuchen, meine dto in meine Einheit abzubilden und diese city_Country Objekt existiert nicht in meiner Entität und beim Mapping ist ein Fehler aufgetreten.

Im Folgenden meine Entitätsobjekt sehen und es gibt keine city_Country Objekt:

enter image description here

Muss ich etwas Besonderes auf meinem Mapping zu tun haben, es zu vermeiden?

Unter meiner Funktion für die Abbildungsoperation ist:

function mapToEntity(entity, dto) { 
    // entity is an object with observables 
    // dto is from json 
    for (var prop in dto) { 
      if (dto.hasOwnProperty(prop)) { 
      entity[prop](dto[prop]); 
      } 
    } 
    return entity; 
} 

Antwort

8

ich, es ist nicht sicher, ob ich gut Praxis einen Vorsprung zu ‚teilweise‘ zu verwenden, füllen ein Entität, so wie es aussieht. Breeze wird automatisch alle echten "Entitäten" zuordnen, die in der Ergebnismenge gefunden werden.Also warum nicht einfach verwenden

var query = EntityQuery.from('Shippers') 
    .where(...) 
    .expand('city.country'); 

die sofortigen Ergebnisse wird eine Sammlung von Versendern, aber jeder Versender seine Stadt und verschachtelte Land Eigenschaften voll als Entitäten wie gut gelöst hat. Sie werden über die Navigation von den zurückgegebenen Verladern verfügbar sein, aber sie werden auch im Cache des EntityManagers verfügbar sein, wenn Sie sie direkt abfragen wollten.

Eine zweite Anmerkung: Breeze 'erweitern' Semantik haben die gleichen Einschränkungen, die das Entity Framework tut. Das bedeutet, dass wir die Eigenschaften einer Projektion nicht erweitern können.

So können Sie entweder den Vorsprung überspringen (wie oben)

var query = EntityQuery.from('Shippers') 
    .where(...) 
    .expand('city.country') 

und erhalten volle „Shipper“ Organisationen, die mit der ‚Stadt“ und ‚Land‘ Eigenschaft auf die Stadt sowohl bevölkert. ... Oder Sie können einen Vorsprung tun, in dem Fall, dass Sie den equivalant der Erweiterung selbst durchführen. dh

in diesem Fall, dass Sie in der Ergebnismenge wi

var query = EntityQuery.from('Shippers') 
    .select('id, name, street, city, city.country') 

wobei jedes Einzelteil werden Sie bestehen aus 5 Eigenschaften. Beachten Sie, dass in diesem Fall nur die Eigenschaften 'city' und 'city.country' zum Cache des EntityManagers hinzugefügt werden, da dies die einzigen 'wahren' Entitäten in der Ergebnismenge sind. d. h. kein Versender

Die Idee, auf die man sich konzentrieren sollte, ist, dass die "Ergebnisse" einer Anfrage und die "Nebenwirkungen" einer Anfrage verschieden sind. Die Ergebnisse auf oberster Ebene einer Abfrage entsprechen genau der erwarteten Form. Die "Nebeneffekte" der Abfrage sind das Ergebnis einer "Erweiterung", die Sie durchführen. Diese ändern die Form der Abfrage nicht, sie ändern lediglich die Auflösung aller geschachtelten Entitätseigenschaften in den Ergebnissen.

Hoffe, das hilft.

+0

Vielen Dank für diese Erklärung. Warum ich die Projektion in meinen Abfragen verwendet habe, liegt daran, dass einige Entitäten eine Menge "schwerer" Eigenschaften wie Bilder enthalten können. Im Falle der Abfrage einer einfachen Liste ist es also besser, nur die notwendigen Eigenschaften oder alle Eigenschaften einer Entität zu erhalten ? – Bronzato

+0

Eine Option besteht einfach darin, die "schweren" Eigenschaften ihrem eigenen EntityType mit einer Eins-zu-Eins-Entsprechung zu dem 'parentType' zuzuordnen, der sie ausschließt. Die andere besteht darin, den Perf/Speicher-Footprint der Verwendung der "vollständigen" Entitäten zu messen und zu sehen, ob sie so teuer sind, wie Sie vermuten. Ich würde mit der einfachsten Architektur beginnen und sie erst dann komplizieren/optimieren, wenn Sie sich selbst beweisen, dass sie nicht performant ist. d.h. nicht zu früh optimieren. –

1

Wir tun dies erlauben:

var query = EntityQuery.from('Shippers') 
      .select('id, name, street, city, city.country') 
+0

Ich habe meine Frage aktualisiert, um das Ergebnis anzuzeigen. Kannst du dir das mal ansehen? Vielen Dank. – Bronzato

+1

Das Ausführen einer One-to-Many-Eigenschaft funktioniert nicht. ExceptionMessage: "Die Eigenschaft 'UserName' des Typs 'System.Collections.Generic.ICollection'1 [Domain.Entities.UserProfile]' konnte nicht gefunden werden.", – Adaptabi

Verwandte Themen