当属性设置为虚拟时,停止实体框架加载
本文关键字:实体 框架 加载 属性 设置 虚拟 | 更新日期: 2023-09-27 18:14:21
在实体框架中,我知道你可以设置一个属性为虚拟的,让它太懒加载,这是伟大的。但是在我的服务代码中,我想加载一个子列表,并且每个子列表中都有一个列表。
我可以在2次点击中加载数据,而不是让实体框架加载此数据。
这是一个例子,我的类
public class Parent
{
public long Id { get; set; }
public virtual ICollection<Child> Children { get; set; }
}
public class Child
{
public long Id { get; set; }
public long ParentId { get; set; }
public ICollection<GrandChild> { get; set; }
}
public class GrandChild
{
public long Id { get; set; }
public long ChildId { get; set; }
public virtual AnotherClass AnotherProperty { get; set; }
}
在我的服务代码我加载这样的数据,因为我不能看到能够一次加载所有的(也许我只是不知道正确的查询语法)
var parent = await _context.Parents
.Where(e => e.Id == 9)
.Include(e => e.Children)
.FirstOrDefaultAsync();
var grandchildren = await _context.GrandChildrens
.Where(e => e.Child.ParentId == 9)
.ToListAsync();
// this is load again?
foreach (var child in parent.Children)
child.GrandChildren = (from a in grandChildren where a.ChildId == child.Id).ToList();
现在每次我试图设置child.GrandChildren
,实体框架试图加载数据。我怎么能停止它加载数据,但没有删除virtual
关键字,因为在其他情况下,我希望实体框架延迟加载。
另外,如果有人知道如何加载父,子,孙子在1查询,请让我知道太
我认为你可以像下面这样急切地加载相关实体:
var parent = await _context.Parents
.Where(e => e.Id == 9)
.Include(e => e.Children.GrandChildrens)
.FirstOrDefaultAsync();
这应该加载父母,他们的孩子和他们的孙子。