2013-04-03 12 views
5

Opracowuję rozwiązanie asp.net z Durandal/breeze.Wykonaj zaznaczenie i rozwiń w tym samym zapytaniu, ale bryza nie jest obsługiwana.

Oto mój kod, aby wszystkie moje spedytorów:

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

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

Oto powiązany model:

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; } 
} 

Teraz muszę także kraje

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

ale z rzeczywiste zapytanie, do którego nie mam krajów.

Staram:

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

ale pojawia się błąd:

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

Moje pytanie: jak dostać krajach?


UPDATE

Jak sugeruje Jay możemy zrobić:

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

Teraz mam city_Country obiektu:

enter image description here

nie mam Rozumiem, dlaczego jedziemy t to city_Country ponieważ dane wiejskie są już dostępne w obiekcie miasto \ Kraj:

enter image description here

Ponadto daje mi problem, ponieważ mój następny rachunek spróbować map moje dto do mojego podmiot i przedmiot ten city_Country nie istnieją w mojej jednostce i wystąpił błąd podczas mapowania.

Poniżej widzimy podmiot, przedmiot i nie ma city_Country obiektu:

enter image description here

Czy muszę zrobić coś szczególnego w moim mapowania, aby tego uniknąć?

Poniżej jest moja funkcja operacji mapowania:

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; 
} 

Odpowiedz

8

nie jestem pewien, że to dobra praktyka, aby korzystać z projekcji „częściowo” wypełnić byt, który wygląda tak, jakbyś to robił. Breeze automatycznie mapuje wszystkie prawdziwe "jednostki", które znajdzie w zestawie wyników.Więc dlaczego nie wystarczy użyć

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

bezpośrednim wynikiem będzie zbiorem spedytorów, ale każdy nadawca będzie musiał jej miasto i właściwości country zagnieżdżone w pełni rozwiązany jako jednostek, jak również. Będą dostępne przez nawigację od zwróconych spedytorów, ale będą również dostępne w pamięci podręcznej entityManager, jeśli chcesz je bezpośrednio zapytać.

Druga uwaga: semantyka "ekspanduj" Breeze ma te same ograniczenia, co struktura Entity. Oznacza to, że nie możemy rozszerzyć właściwości rzutowania.

Więc można też pominąć projekcję (jak wyżej)

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

i uzyskać pełne podmioty „spedytor” z „miasta” i «własność państwa» na miasto zarówno zaludnionych. Albo ... można zrobić projekcję, w tym przypadku wykonać equivalant ekspansji samodzielnie. tj

w tym przypadku będzie

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

w takim przypadku każdy element w swoim zbiorze wyników wi Składa się z 5 właściwości. Zauważ, że w tym przypadku tylko właściwości "city" i "city.country" zostaną dodane do pamięci podręcznej entityManager, ponieważ są to jedyne "prawdziwe" jednostki w zestawie wyników. to znaczy, że nie ma żadnego nadawcy, aby uzyskać jednoznaczne wyjaśnienie, że "wyniki" zapytania i "efekty uboczne" zapytania są różne. Wyniki najwyższego poziomu zapytania będą dokładnie takie, jakich oczekujesz. "Skutki uboczne" zapytania są wynikiem dowolnego "rozwinięcia", które wykonujesz. Nie zmieniają one kształtu zapytania, po prostu zmieniają rozdzielczość zagnieżdżonych właściwości "obiektu" w wynikach.

Mam nadzieję, że to pomoże.

+0

Dziękuję za to wyjaśnienie. Dlaczego użyłem projekcji w moich kwerendach, ponieważ niektóre encje mogą zawierać wiele "ciężkich" właściwości, takich jak obrazy, ... więc w przypadku zapytań o prostą listę lepiej jest uzyskać tylko niezbędne właściwości lub wszystkie właściwości jednostki ? – Bronzato

+0

Jedną z opcji jest po prostu odwzorowanie "ciężkich" właściwości na ich własny typ EntityType z jednoznaczną korespondencją do "parentType", która je wyklucza. Drugim jest faktyczne zmierzenie śladu perf/memory przy użyciu "pełnych" bytów i sprawdzenie, czy są one tak drogie, jak podejrzewasz. Zacznę od najprostszej architektury i komplikuję/optymalizuję ją tylko wtedy, gdy sam się przekonasz, że nie jest wydajna. tj. nie optymalizuj zbyt wcześnie. –

1

Robimy to pozwolić:

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

Zaktualizowałem moje pytanie, aby wyświetlić wynik. Czy możesz rzucić okiem? Dzięki. – Bronzato

+1

Wykonanie tej czynności dla właściwości typu jeden-do-wielu nie działa Komunikat o wyjątku: "Nie można zlokalizować właściwości" nazwa użytkownika "na typie" System.Collections.Generic.ICollection'1 [Domain.Entities.UserProfile] ".", – Adaptabi

Powiązane problemy