2010-07-27 102 views
0

這是從我前幾天發佈的另一個問題分離出來的,這個問題被成功地回答了,但它確實沒有涉及到我所遇到的潛在問題,但無法在我原來的查詢中充分表達。做在Linq的急切加載和投影到實體

我有一個表產品。產品與ProductDescription以一對多的關係相關。每個產品的ProductDescription可以有多行。如果產品描述有多個翻譯,它將有多行。產品與語言有多對一的關係。語言具有語言代碼(en,es等)以及LanguageId(也可以在ProductDescription中找到)。

我想讓我的用戶能夠請求產品,並進一步告訴應用程序僅以特定語言返回該產品的描述。

我遇到的問題是我明白我需要使用投影來完成這個問題的第3段中的任務。事情是這樣的:

var query = inventoryRepository.Products 
         .Where(wherePredicate) 
         .Select(a=> new Product 
         { 
          ProductDescriptions = inventoryRepository.ObjectContext.ProductDescriptions 
           .Where(a => a.Languages.AlternateCode.Equals("en", StringComparison.CurrentCultureIgnoreCase)) 
         }); 

但是我必須在產品表約15性質以及需要加載的結果除了剛纔語言件套產品的其他4個表。有沒有什麼辦法讓我做急切的加載和投影,這樣我就不必手動去映射所有這些屬性和子對象?這裏是我的代碼現在的位置:

var query = inventoryRepository.ObjectSet 
        .Include("ProductDescriptions") 
        .Include("ProductAllowedWarehouses") 
        .Include("ProductToCategories") 
        .Include("PriceLevels") 
        .Include("AttachmentAssociations.Attachment").AsExpandable() 
        .Where(wherePredicate); 

否選擇必要,這是非常好的。一旦我將ProductDescriptions更改爲投影,我添加了一個Select,然後我沒有得到其他任何免費填充的屬性/子項。

回答

1

我會讀這blog關於預測+渴望加載。當涉及到急切的加載時,您將遇到問題。建議使用.Any並執行一個子選擇。

爲什麼不能在ProductDescriptions上添加一個過濾器/哪裏?

var query = inventoryRepository.ObjectSet 
       .Include("ProductDescriptions") 
       .Include("ProductAllowedWarehouses") 
       .Include("ProductToCategories") 
       .Include("PriceLevels") 
       .Include("AttachmentAssociations.Attachment").AsExpandable() 
       .Where(wherePredicate) 
       .Where(a=>a.ProductDescriptions.Languages.AlternateCode.Equals("en", StringComparison.CurrentCultureIgnoreCase); 
+0

我不知道我可以堆疊兩個這樣的地方。這會改變產品結果集嗎?例如,如果我獲得產品ID 1,2,3和4,並且只有1,2和3具有「en」翻譯,我仍然想要返回產品4.我只會返回產品4而不帶「en」翻譯。 – omatase 2010-07-27 21:29:59

+0

這樣做是爲了轉儲SQl。 (查詢爲ObjectQuery ).ToTraceString();它會將sql轉儲到輸出窗口。 – Nix 2010-07-28 12:27:46

+0

它只是建立一個IQueryable,所以它會追加到最後的查詢位置,所以它必須符合又名爲「EN」的條件 – Nix 2010-07-28 12:34:01