2011-03-31 40 views
3

當我執行此查詢我可以在TypeP財產導航:問題與實體框架導航性能

var items = from item in context.ProductosBodegas.Include("Product.TypeP") 
      select item; 

但是,當我執行此查詢TypeP物業是null

var items = from item in context.ProductosBodegas.Include("Product.TypeP") 
      select item.Product; 

爲什麼這個?

回答

4

看起來像只包括影響直接返回的對象:

http://msdn.microsoft.com/en-us/library/bb896272.aspx

否則,您可以撥打

item.TypePReference.Load() 

但是這可以(會)導致perfornance問題(N + 1選擇),如果在循環中使用。

另一種選擇是「反向」您的查詢,假設產品和ProductosBodegas之間的關係是雙向的:

var items = context.Products 
    .Include("TypeP") 
    .Where(p => p.ProductosBodegas.Any(/* include condition here if needed */)) 
+0

感謝您的幫助...... – Pablogrind 2011-03-31 14:26:13

2

據我所知實體框架忽略,只要你不想返回包括完整的實體,但只有預測。例如見答案here。我不確定這是否仍然適用於所有類型的預測,但顯然它仍然適用於您的情況。

您可以通過添加您希望其具有裝載到一個匿名類型的導航屬性解決此:

var items = from item in context.ProductosBodegas 
      select new { 
       Product = item.Product, 
       TypeP = item.Product.TypeP 
      }; 

(你不需要.Include這裏了。)執行這個查詢(通過使用.ToList()爲後實例),你可以投射到你想有,像這樣的匿名類型的只是一部分:

var products = items.ToList().Select(x => x.Product); 

在此products集合中的元素現在已經加載了TypeP參考屬性。

編輯:

重要提示:請不要更改.ToList.Select...的順序。雖然這...

var products = items.Select(x => x.Product).ToList(); 

...也語法正確,並返回一個產品一個枚舉,該TypeP參考不會在這種情況下加載。首先在數據庫中執行匿名類型的查詢,並將匿名類型集合加載到內存中。然後,您可以扔掉.Select方法不希望擁有的那種類型的部分。

+0

Slauma - 你是正確的,事實證明我沒有在運行測試之前關閉延遲加載過測試了 - 刪除了我的答案。 – BrokenGlass 2011-03-31 16:11:34

1

您應該加載產品第一

var items = from item in context.ProductosBodegas.Include("Product").Include("Product.TypeP") 
      select item;