2010-08-29 28 views
8

Tôi có một giải pháp mà tôi đã tạo các thực thể theo dõi tự sử dụng các mẫu RTM. Tôi đã chia các thực thể và bối cảnh giữa 2 dự án để tôi có thể tái sử dụng các định nghĩa kiểu như tôi định chạy máy khách/máy chủ thông qua WCF.Entity Framework 4: Eager Loading (Bao gồm) với các bộ lọc sử dụng Self Tracking Entities

Một trong các phương thức dịch vụ của tôi là bắt buộc để trả về biểu đồ các đối tượng "Sản phẩm" với các đối tượng con của "ProductSku" và các đối tượng này có đối tượng con là "ProductPrice". Tiêu chí lựa chọn sẽ nằm trên thuộc tính "Tên" của đối tượng "Sản phẩm" và thuộc tính "FinancialPeriodID" của "ProductPriceObject". Hiện tại, tôi không bao gồm tên trong tìm kiếm, nhưng tôi đang gặp vấn đề khi đưa biểu đồ trở lại.

Nếu tôi chỉ đơn giản là thực hiện các truy vấn sau đây (lưu ý, cú pháp này được lấy từ LinqPad chứ không phải là mã ứng dụng thực tế) ...

from product in Products.Include("Skus.PriceHistory") 
select product 

... sau đó tôi có thể lấy lại đồ thị đối tượng đầy đủ cho các mục mà tôi yêu cầu, tất nhiên vào thời điểm này không có bộ lọc.

Nếu thay vào đó, tôi giới thiệu các bộ lọc như sau ...

from product in Products.Include("Skus.PriceHistory") 
join sku in ProductSkus on product.ID equals sku.ProductID 
join price in ProductPrices on sku.ID equals price.ProductSkuID 
where price.FinancialPeriodID == 244 
select product 

... những gì tôi đang mong đợi để có được trở lại là "sản phẩm" đối tượng, đứa trẻ "productSku" đối tượng (mà là ở bộ sưu tập "Skus" của "Product") và đối tượng "ProductPrice" của chúng (nằm trong bộ sưu tập "PriceHistory" của "ProductSku") - nhưng tôi chỉ lấy lại đối tượng "Product", bộ sưu tập "Skus" là trống.

Tôi cũng đã thử mã hóa các truy vấn như ...

from product in Products.Include("Skus.PriceHistory") 
from sku in product.Skus 
from price in sku.PriceHistory 
where price.FinancialPeriodID == 244 
select product 

... nhưng điều này làm cho không có sự khác biệt trong hai.

Rõ ràng, tôi phải làm điều gì đó sai. Ai đó có thể làm sáng tỏ điều gì đó giống như tôi đã từng làm việc này trong một vài giờ đồng hồ đi vòng quanh!

Trả lời

1

Edit:

gì về:

from product in Products.Include("Skus.PriceHistory") 
where product.Skus.Any(s => s.PriceHistory.Any(p => p.FinancialPeriodID == 244)) 
select product 

Include đã thực hiện tất cả các nhiệm vụ cần thiết để điền vào các thuộc tính định hướng để bổ sung tham gia cho nơi mà điều kiện không cần thiết. Điều quan trọng hơn nữa là việc tham gia thủ công hoặc chiếu sẽ thay đổi hình dạng truy vấn và Include sẽ không được sử dụng.

Cũng hãy cẩn thận khi điều kiện chỉ lọc các sản phẩm. Nó sẽ không lọc dữ liệu được tải bởi Include - bạn sẽ nhận được tất cả các sản phẩm có ít nhất một sku có lịch sử giá với thời hạn tài chính id 244 nhưng các sản phẩm đó sẽ có tất cả lịch sử giá và lịch sử tải. EF hiện không hỗ trợ lọc trên bao gồm. Nếu bạn cần quan hệ lọc cũng như bạn phải thực hiện các truy vấn riêng biệt để có được chúng.

+0

Xin lỗi, "SKU" và "PriceHistory" đều các bộ sưu tập, vì vậy nó không thể điều hướng tất cả các con đường xuống đường dẫn trong một câu lệnh duy nhất. Tôi lo sợ không có tùy chọn nào khác ngoài việc bao gồm các phép nối bằng cách sử dụng hoặc kết nối hoặc từ như được hiển thị trong hai ví dụ. Cảm ơn mọi người. –

+0

Điều này có thể đã không giúp @MartinRobins, nhưng nó đã giúp tôi trong dự án của riêng tôi! 1 Cú pháp này làm việc cho tôi (có lẽ là thiết lập hoàn toàn khác với câu hỏi ban đầu, tôi không biết ...) – BenSwayne

1

Có thể phép chiếu có thể thực hiện thủ thuật này?

Hãy xem Linq filter collection with EF

+0

Cảm ơn, nhưng tôi thực sự muốn giảm thiểu số lượng kiểu đối tượng mà tôi đang đi qua. Tôi đã có một loại "Sản phẩm" hoàn hảo, tôi chỉ muốn tải mong muốn hoạt động đúng cách để các đối tượng con được phổ biến. –

-1

thực thể tự theo dõi không được kích hoạt để thực hiện tải lười biếng. Đó là lý do tại sao bộ sưu tập không trống với việc tạo thực thể mặc định chứ không phải với STE. Trong thực tế, Bao gồm của bạn không bao giờ tải các thực thể liên quan nếu bạn sử dụng chúng trên truy vấn. Bây giờ truy vấn L2E của bạn không chính xác.Tôi nghĩ rằng bạn muốn làm một cái gì đó như thế này:

Hy vọng rằng sẽ giúp

Matthieu

+0

Tôi không cố gắng sử dụng tải chậm; Tôi đang cố gắng sử dụng tải háo hức. Nếu tôi loại bỏ mệnh đề where, hoặc chỉ căn cứ vào đối tượng cấp cao nhất, tôi sẽ nhận được tất cả các đối tượng đúng cách. Chỉ khi tôi sử dụng mệnh đề where dựa trên các thuộc tính của các đối tượng con mà "Include" bị bỏ qua. –

+0

Hi Martin, bạn đã tìm ra giải pháp chưa, tôi có cùng một vấn đề – freddoo

0

Có Bao gồm không phải là một đảm bảo để có tải háo hức và nó có thể được bỏ qua lặng lẽ bởi vì những điều sau đây lý do. Nó được giải thích tốt hơn trong chủ đề này. Bạn có thể chọn bảng bạn muốn tải theo cách thủ công, ví dụ:

var result = from product in Products.Include("Skus.PriceHistory") 
from sku in product.Skus 
from price in sku.PriceHistory 
where price.FinancialPeriodID == 244 
select new { p=product, pricehistory = product.Skus.PriceHistory}; 
var products = results.select(pph => pph.product); 

https://social.msdn.microsoft.com/Forums/en-US/76bf1f22-7674-4e1e-85d3-68d29404e8db/include-is-ignored-in-a-subquery?forum=adodotnetentityframework

  • Bao gồm chỉ áp dụng cho các mục trong kết quả truy vấn: đối tượng là dự kiến ​​tại các hoạt động ngoài cùng trong truy vấn.
  • Loại kết quả phải là loại thực thể.
  • Truy vấn không thể chứa hoạt động mà thay đổi kiểu của kết quả giữa Include và các hoạt động ngoài cùng (tức là một groupby() hoặc Chọn() hoạt động mà thay đổi kiểu kết quả)
  • Tham số chụp bởi Bao gồm là một dấu chấm phân định con đường hàng hải tài sản mà phải điều hướng từ một thể hiện của loại trả lại vào hoạt động ngoài cùng
Các vấn đề liên quan