使用include不会改变行为

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

Sal*_*ari 6

两个查询中检索相关数据只用第一查询预先加载(是预先加载是通过使用来实现的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将是更好的选择.