我的一个datagrid表的工作速度比其他表快x100倍(从延迟加载的120个中加载5个记录需要15秒)。在我的服务层中,我返回如下记录:
users = personRepository.GetAll()
.GroupBy(g => g.PersonId)
.Select(a => a.FirstOrDefault())
.Join(personRepository.GetAll(),
m => m.PersonId,
m => m.PersonId,
(state1, state2) => new { state1, state2})
.GroupBy(g => g.state2.PersonId)
.Select(a => a.OrderByDescending(t => t.state2.Date).FirstOrDefault())
.OrderByDescending(o => o.state2.Id)
.Select(s => new UsersSG()
{//***********ATTENTION***********
state1= s.state1,
state2= s.state2
});
在编写了“ATTENTION”的部分中,我将匿名类型的属性映射到我的viewmodel的虚拟属性,但我不确定这是否会破坏延迟加载。对应的viewmodel定义如下:
public virtual AkrKisiDurum state1 { get; set; }
public virtual AkrKisiDurum state2 { get; set; }
在我返回IQueryable列表后,我就像我的其他表一样对请求进行过滤,排序和分页,并将结果返回给view。我查看了生成的查询,并没有出现任何花哨的内容。
答案 0 :(得分:1)
是的,它是制动器延迟加载,因为您正在创建UsersSG
类型的实例。延迟加载由从您的实体派生的自定义类提供(请参阅Working with Proxies)。这就是为什么可延迟加载的导航属性应该是虚拟的 - 实体框架为从实体继承的类提供DbContext,并覆盖这些属性以使用DbContext来延迟加载数据。
此外,如果您将数据分配给某个虚拟导航属性,它将不会进一步使用延迟加载,因为您已经提供了数据。