這是從我前幾天發佈的另一個問題分離出來的,這個問題被成功地回答了,但它確實沒有涉及到我所遇到的潛在問題,但無法在我原來的查詢中充分表達。做在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,然後我沒有得到其他任何免費填充的屬性/子項。
我不知道我可以堆疊兩個這樣的地方。這會改變產品結果集嗎?例如,如果我獲得產品ID 1,2,3和4,並且只有1,2和3具有「en」翻譯,我仍然想要返回產品4.我只會返回產品4而不帶「en」翻譯。 – omatase 2010-07-27 21:29:59
這樣做是爲了轉儲SQl。 (查詢爲ObjectQuery).ToTraceString();它會將sql轉儲到輸出窗口。 –
Nix
2010-07-28 12:27:46
它只是建立一個IQueryable,所以它會追加到最後的查詢位置,所以它必須符合又名爲「EN」的條件 – Nix 2010-07-28 12:34:01