EF延迟加载 - 将匿名类型映射到自定义虚拟属性

时间:2014-01-02 15:48:26

标签: c# asp.net-mvc linq entity-framework

我的一个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。我查看了生成的查询,并没有出现任何花哨的内容。

1 个答案:

答案 0 :(得分:1)

是的,它是制动器延迟加载,因为您正在创建UsersSG类型的实例。延迟加载由从您的实体派生的自定义类提供(请参阅Working with Proxies)。这就是为什么可延迟加载的导航属性应该是虚拟的 - 实体框架为从实体继承的类提供DbContext,并覆盖这些属性以使用DbContext来延迟加载数据。

此外,如果您将数据分配给某个虚拟导航属性,它将不会进一步使用延迟加载,因为您已经提供了数据。