我希望我的查询结果只包含一些相关的数据。例如,我有实体 Sale 和 Item ,每个 Sale 都有一个 Items 属性,该属性是特定销售的 Item 列表:
from s in myContext.Sales
select s;
返回所有销售,每个销售包含所有项目(当我导航到项目时,默认情况下 LazyLoading 处于打开状态)。但我只想包含每个销售的特定项目 - 比如说名称 ==“橙色”的项目,我仍然想要所有销售。我怎样才能做到这一点?
我希望我的查询结果只包含一些相关的数据。例如,我有实体 Sale 和 Item ,每个 Sale 都有一个 Items 属性,该属性是特定销售的 Item 列表:
from s in myContext.Sales
select s;
返回所有销售,每个销售包含所有项目(当我导航到项目时,默认情况下 LazyLoading 处于打开状态)。但我只想包含每个销售的特定项目 - 比如说名称 ==“橙色”的项目,我仍然想要所有销售。我怎样才能做到这一点?
如果开启延迟加载,它实际上会延迟加载您引用的内容。如果您不想启用它,请将其关闭。
myContext.Configuration.LazyLoadingEnabled = false;
您可以指定您希望在初始数据库往返中加载某些内容,这样就不需要延迟加载。在那里,Include是你的朋友。
using System.Data.Entity; // You need this to get the lambda version of Include
from s in myContext.Sales.Include(s => s.PropertyA).Include(s => s.PropertyB)
select s;
请注意,您始终可以通过不将特定属性声明为虚拟来禁用延迟加载。
我推荐以下博客以获得很好的概述
我的回答是针对 EF 4.0 的,主要来自这里:http: //msdn.microsoft.com/en-us/library/bb896249.aspx
防止 LazyLoading 在访问导航属性时加载所有内容:
myContext.Configuration.LazyLoadingEnabled = false;
加载您的项目:
List<Sale> sales = (from s in myContext.Sales
select s).ToList()
Foreach item 附加你想要的相关项目(只获取一些项目的关键是 CreateSourceQuery() 方法):
foreach(Sale s in sales)
s.Items.Attach(s.Items.CreateSourceQuery().Where(i => i.Name == "Orange"));