2011-03-31 39 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;