2013-04-03 20 views
5

Tôi phát triển một giải pháp asp.net với Durandal/khoe.Thực hiện lựa chọn và mở rộng trong cùng một truy vấn với gió không được hỗ trợ

Đây là mã của tôi để nhận được tất cả các chủ hàng của tôi:

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

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

Dưới đây là mô hình có liên quan:

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

Bây giờ tôi cần phải cũng bao gồm các nước

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

Nhưng với truy vấn thực tế tôi không nhận được quốc gia với nó.

tôi cố gắng:

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

nhưng tôi nhận được lỗi:

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

Câu hỏi của tôi: làm thế nào để có được nước?


CẬP NHẬT

Như Jay đề nghị, chúng ta có thể làm:

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

Bây giờ, tôi có một đối tượng city_Country:

enter image description here

tôi không hiểu tại sao chúng ta đi t city_Country này vì dữ liệu quốc gia đã có sẵn trong đối tượng thành phố \ quốc gia:

enter image description here

Hơn nữa nó mang lại cho tôi vấn đề vì tuyên bố tiếp theo của tôi cố gắng để ánh xạ dto tôi vào thực thể của tôi và đối tượng city_Country này không tồn tại trong thực thể của tôi và đã xảy ra lỗi khi ánh xạ.

Dưới đây chúng ta thấy đối tượng thực thể của tôi và không có city_Country đối tượng:

enter image description here

Tôi có phải làm điều gì đó đặc biệt trên bản đồ của tôi để tránh nó?

Dưới đây là chức năng của tôi cho các hoạt động lập bản đồ:

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

Trả lời

8

Tôi không chắc chắn đó là thực hành tốt để sử dụng một phép chiếu để 'partially' điền một thực thể, đó là những gì nó trông giống như bạn đang làm. Breeze sẽ tự động ánh xạ bất kỳ 'thực thể' thực nào mà nó tìm thấy trong tập kết quả của bạn.Vậy tại sao không chỉ cần sử dụng

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

Các kết quả ngay lập tức sẽ là một bộ sưu tập của các chủ hàng, nhưng mỗi người gửi hàng sẽ phải thành phố của mình và tài sản nước lồng nhau hoàn toàn được giải quyết như những thực thể là tốt. Chúng sẽ có sẵn thông qua điều hướng từ các chủ hàng trả lại trả về nhưng chúng cũng sẽ có sẵn trong bộ nhớ cacheManager nếu bạn muốn truy vấn trực tiếp.

Lưu ý thứ hai: Ngữ nghĩa 'mở rộng' có cùng các hạn chế mà Khung thực thể thực hiện. Điều này có nghĩa là chúng ta không thể mở rộng các thuộc tính của phép chiếu.

Vì vậy, bạn có thể bỏ qua chiếu (như trên)

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

và nhận được đầy đủ "Shipper" thực thể với 'thành phố" và" tài sản quốc gia trên thành phố cả dân cư. ... Hoặc bạn có thể làm một dự báo, trong trường hợp bạn thực hiện các equivalant của việc mở rộng chính mình. tức là

trong trường hợp này bạn sẽ

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

trong trường hợp này mỗi mục trong kết quả của bạn thiết lập wi ll bao gồm 5 thuộc tính. Lưu ý rằng trong trường hợp này chỉ các thuộc tính 'city' và 'city.country' sẽ được thêm vào bộ nhớ cache của entityManager vì đây là các thực thể 'true' duy nhất trong tập kết quả. nghĩa là không có người gửi hàng

Ý tưởng rõ ràng là 'kết quả' của truy vấn và 'tác dụng phụ' của truy vấn là khác biệt. Kết quả cấp cao nhất của truy vấn sẽ chính xác như hình dạng bạn mong đợi. 'Phản ứng phụ' của truy vấn là kết quả của bất kỳ 'mở rộng' nào bạn thực hiện. Những điều này không thay đổi hình dạng của truy vấn, chúng chỉ thay đổi độ phân giải của bất kỳ thuộc tính lồng nhau 'thực thể' nào trong kết quả.

Hy vọng điều này sẽ hữu ích.

+0

Cảm ơn bạn đã giải thích này. Tại sao tôi sử dụng phép chiếu trong querries của tôi là vì một số thực thể có thể chứa nhiều thuộc tính 'nặng' như hình ảnh, ... trong trường hợp truy vấn một danh sách đơn giản thì tốt hơn là chỉ lấy các thuộc tính cần thiết hoặc tất cả các thuộc tính của thực thể ? – Bronzato

+0

Một tùy chọn đơn giản là ánh xạ các thuộc tính "nặng" tới EntityType của riêng chúng với một từ một đến một thư từ với 'parentType' sẽ loại trừ chúng. Khác là để thực sự đo lường dấu chân perf/bộ nhớ của việc sử dụng các thực thể "đầy đủ" và xem nếu họ là đắt tiền như bạn nghi ngờ. Tôi bắt đầu với kiến ​​trúc đơn giản nhất và chỉ phức tạp/tối ưu hóa nó một khi bạn chứng minh với chính mình rằng nó không thực hiện được. tức là đừng tối ưu hóa quá sớm. –

1

Chúng tôi cho phép này:

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

Tôi đã cập nhật câu hỏi của mình để hiển thị kết quả. Bạn có thể xem một lần một lần được không? Cảm ơn. – Bronzato

+1

Làm điều này với một thuộc tính một-nhiều không hoạt động Ngoại lệ: "Không thể định vị thuộc tính 'Tên người dùng' trên loại 'System.Collections.Generic.ICollection'1 [Domain.Entities.UserProfile]'.", – Adaptabi

Các vấn đề liên quan