2010-08-29 66 views
8

我有一個解決方案,我使用RTM模板創建了自我跟蹤實體。我在兩個項目之間分割了實體和上下文,以便我可以重用類型定義,因爲我計劃通過WCF運行客戶端/服務器。實體框架4:使用自我跟蹤實體的過濾器加載(包含)

我的一個服務方法是用「ProductSku」的子對象返回一個「Product」對象的圖形,而這些子對象又具有「ProductPrice」的子對象。選擇標準將位於「Product」對象的「Name」屬性以及「ProductPriceObject」的「FinancialPeriodID」屬性中。目前,我沒有在搜索中包含該名稱,但我有問題帶回圖表。

如果我只是執行下面的查詢(注意,這句法從LinqPad拍攝,而不是實際的應用程序代碼)...

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

...然後我能夠檢索完整的對象圖對於我需要的項目,當然在這一點上沒有過濾器。

相反,如果我介紹過濾器如下...

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 

...我所期待得到的回覆是「產品」的對象,孩子「ProductSku」對象(這是在「Product」的「Skus」集合)及其「ProductPrice」對象(位於「ProductSku」的「PriceHistory」集合中) - 但我只返回「Product」對象,「Skus」集合是空。

我也曾嘗試編碼查詢作爲...

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

...但是這並沒有區別兩種。

顯然,我一定在做錯事。任何人都可以從中瞭解到什麼是什麼,因爲我已經在這裏待了好幾個小時,現在正在圈子裏散步!

回答

1

編輯:

什麼:

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

Include已完成所有必要的工作,以填補導航屬性,以便更多的加入了在不需要條件。更重要的是,手動連接或投影將改變查詢的形狀,並且不會使用Include

另外要注意,哪裏的條件只過濾產品。它不會過濾由Include加載的數據 - 您將獲得至少一個具有價格歷史,財務期間爲id 244的sku的所有產品,但這些產品將加載所有skus和價格歷史記錄。 EF目前不支持包含過濾。如果您還需要過濾關係,則必須執行單獨的查詢才能獲取它們。

+0

對不起,「成品保持單元」和「PriceHistory」是兩個集合,所以這是不可能的在單個語句中沿路徑一路導航。我擔心沒有選擇,只能使用連接或from來包含連接,如兩個示例中所示。 無論如何,謝謝。 – 2010-08-29 16:36:31

+0

這可能沒有幫助@MartinRobins,但它幫助我在我自己的項目中! +1這個語法適用於我(也許完全不同於原始問題的設置,我不知道......) – BenSwayne 2013-05-09 17:34:38

1

也許投影可以做到這一招?

Linq filter collection with EF

+0

謝謝,但我真的想要最小化我傳遞的對象類型的數量。我已經有了一個完美的「產品」類型,我只是希望加載正常工作,以便填充子對象。 – 2010-09-05 09:02:25

-1

自跟蹤實體看看是不是能夠執行延遲加載。 這就是爲什麼收集不是空的與默認實體生成,而不是與STE。實際上,如果您在查詢中使用它們,則「包含」不會加載相關實體。 現在您的L2E查詢不正確。我認爲,你想要做這樣的事情:

希望幫助

馬修

+0

我不想使用延遲加載;我正在嘗試使用急切的加載。如果我刪除where子句,或僅將它基於頂層對象,則我會正確地獲取所有對象。只有當我使用基於子對象屬性的where子句時,「Include」纔會被忽略。 – 2010-09-05 09:00:53

+0

嗨馬丁,你找到了解決方案,我有同樣的問題 – freddoo 2011-09-02 20:55:12

0

有包括並不保證有預先加載,它可以被忽略不計,因爲下面的原因。這個線程最好解釋一下。 您可以手動選擇您想要加載的表格,例如

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

  • 包括只適用於在查詢結果中的項目:是 在查詢中的最外面的操作投射對象。
  • 結果的類型必須是實體類型。
  • 查詢無法包含改變 結果的類型的操作包括之間和最外的操作(即,一個的GroupBy() 或選擇()的操作,改變的結果類型)
  • 所採取的參數包括是即必須從 在最外操作返回的類型的實例可導航的導航 特性的點分隔的路徑