Any*_*are 6 c# sql-server performance entity-framework entity-framework-6
有人可以帮我澄清之间的区别:
var query = awlt.People.Include(p => p.EmailAddresses)
.Where(p => p.LastName.Equals(lastName))
.SelectMany(a => a.EmailAddresses)
.Select(a => a.EmailAddress1);
Run Code Online (Sandbox Code Playgroud)
var query = awlt.People
.Where(p => p.LastName.Equals(lastName))
.SelectMany(a => a.EmailAddresses)
.Select(a => a.EmailAddress1);
Run Code Online (Sandbox Code Playgroud)
在两种情况下我都得到了相同的结果而不知道差异.Eager Loading是否需要使用Include
?
两个查询中检索相关数据只用第一查询预先加载(是预先加载是通过使用来实现的Include
,你猜法)和第二个查询使用延迟加载默认情况下是.但由于您的查询只会EmailAddresses
因为Select()
和SelectMany()
操作而Include()
返回,因此该方法不会更改行为.要查看示例何时 Include()
在您的示例中是重要的,请阅读以下行,我将在一个示例中证明它:
要了解这两种加载相关实体之间的差异,当您需要主表的所有检索行的相关数据时,Eager加载通常更有效.以及当关系是 不是太多,预先加载将是很好的做法,以减少对服务器进一步查询.但是当你知道你不会立即需要一个属性时,延迟加载可能是一个不错的选择.而且,如果您的数据库上下文被丢弃并且无法再进行延迟加载,那么急切加载也是一个不错的选择.要证明一个是Lazy Loading,一个是Eager Loading,请考虑以下代码:
public List<Person> GetEmailAddresses()
{
using (yourEntities awlt = new yourEntities())
{
var query = awlt.People
.Where(p => p.LastName.Equals(lastName));
return query.ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
调用此方法后,您无法延迟加载相关实体,因为已释放数据库.要证明尝试这个:
var query = GetEmailAddresses();
foreach (var item in query.SelectMany(a => a.EmailAddresses).Select(a => a.EmailAddress1))
{
MessageBox.Show(item);
}
Run Code Online (Sandbox Code Playgroud)
你会得到这个错误:
ObjectContext实例已被释放,不能再用于需要连接的操作.
但是如果你改变GetEmailAddresses
使用Eager Loading就像这样:
public List<Person> GetEmailAddresses()
{
using (yourEntities awlt = new yourEntities())
{
var query = awlt.People.Include("EmailAddresses")
.Where(p => p.LastName.Equals(lastName));
return query.ToList();
}
}
Run Code Online (Sandbox Code Playgroud)
那么下面的代码应该可以正常工作:
var query = GetEmailAddresses();
foreach (var item in query.SelectMany(a => a.EmailAddresses).Select(a => a.EmailAddress1))
{
MessageBox.Show(item);
}
Run Code Online (Sandbox Code Playgroud)
因此,在处理db上下文的情况下,Eager Loading将是更好的选择.
归档时间: |
|
查看次数: |
482 次 |
最近记录: |