Như @Sampath nói, điều này thường được thực hiện với các thuộc tính điều hướng nhưng tôi tin rằng mã của anh ấy không chính xác làm những gì bạn muốn. Điều này (tôi nghĩ) gần hơn:
var dests = context.Destinations
.Where(d => d.Country == "USA")
.Select(d =>
new { d,
RemoteLodgings = d.Lodgings
.Where(l => l.MilesFromNearestAirport > 5)}
.ToList();
Nhưng nó vẫn không làm những gì bạn muốn nếu tôi yêu cầu thư của bạn. Bạn muốn vị trí có chỗ ở là bao gồm, tức là các thuộc tính điều hướng được tải một phần. Điều này có thể thuận tiện khi các thực thể được sắp xếp theo thứ tự và được gửi đến một máy khách (web) trong một gói. (Mặc dù phương pháp trên cũng có thể được chấp nhận cho điều đó).
Nhưng có thể tạo bộ sưu tập với các thuộc tính điều hướng được tải một phần.
Cuốn sách, ở trang 40, cho thấy cách bạn có thể tải một phần thuộc tính điều hướng của một thực thể (viết tắt là context.Entry(entity).Collection(e => e.Children).Query().Where(condition)
. Nhưng như đã nói, đó chỉ là một ví dụ. Đây không phải là phương pháp tốt nhất để làm điều đó cho một tập hợp tổ chức
điều buồn cười là (như là một đồng nghiệp của tôi phát hiện ra), bạn có thể dễ dàng làm điều đó cho một tập hợp các thực thể bằng cách tải các yếu tố bộ sưu tập cần thiết vào bối cảnh riêng biệt:.
var lodgings = context.Lodgings
.Where(l => l.MilesFromNearestAirport > 5
&& l.Destination.Country == "USA")
.ToList();
Bây giờ nếu bạn vòng qua context.Destinations.Where(d => d.Country == "USA")
bạn sẽ thấy rằng chỗ ở của họ được tải bằng những cái ">5
". Có lẽ bởi vì tại thời điểm này, EF đã thực hiện sửa lỗi quan hệ. (Tải Lazy bị vô hiệu hóa, vì tải lười sẽ tải đầy đủ các thuộc tính điều hướng).
Sửa (sau khi bình luận của bạn)
tôi không thể đồng ý hơn khi bạn nói nó là một chút của một hack. Trên thực tế tôi quên đề cập đến rằng ở nơi đầu tiên. Vấn đề là toàn bộ cơ chế sụp đổ khi việc tải chậm xảy ra sẽ được kích hoạt bởi một người không biết mã của cái gì. Tôi không thích mã phụ thuộc vào nhà nước theo cách không rõ ràng. Vì vậy, tôi sẽ luôn luôn thích cách tiếp cận đầu tiên.
Nguồn
2012-12-16 19:39:09
Lựa chọn hợp lệ. – usr
Cách tiếp cận là sai vì sự tham gia bên trái. Bạn cần phải làm một cái gì đó tương tự: .Where (d => d.Country == "USA" && (d.Lodgings.Count == 0 || d.Lodgings.Any (l => l.MilesFromNearestAirport == null || l.MilesFromNearestAirport> 5)) Điều này sẽ lấy các vị trí chính xác Khi truy cập vào các lodgings, cùng một biểu thức trong các điều khoản chỗ ở sẽ cần phải được sử dụng để lấy các chỗ ở áp dụng. Theo như tôi biết, khung thực thể chỉ hỗ trợ tham gia bên trong Một lưu ý khác, truy vấn này sẽ khá đơn giản trong nhibernate – Shelakel
Cả hai giải pháp này đều không hoạt động Shelakel, bạn đã sử dụng NHibernate nhiều chưa? Bạn có nên giới thiệu nó qua EF? – orangesherbert