小编jpa*_*aya的帖子

实体框架6:即使在查询中显式加载,也会延迟加载虚拟集合

尝试优化查询时,我遇到EF6问题.考虑这个有一个集合的类:

public class Client
{
    ... a lot of properties
    public virtual List<Country> Countries { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

您可能知道,使用延迟加载我有这个n + 1问题,当EF试图为每个客户端获取所有国家/地区时.

我试图使用Linq投影; 例如:

        return _dbContext.Clients
            .Select(client => new
            {
                client,
                client.Countries
            }).ToList().Select(data =>
            {
                data.client.Countries = data.Countries; // Here is the problem
                return data.client;
            }).ToList();
Run Code Online (Sandbox Code Playgroud)

这里我使用两个选择:第一个用于Linq投影,因此EF可以创建SQL,第二个用于将结果映射到Client类.原因是因为我正在使用一个返回的存储库接口List<Client>.

尽管查询是使用其中的国家生成的,但当我尝试渲染整个信息时,EF仍在使用延迟加载(相同的n + 1问题).避免这种情况的唯一方法是删除虚拟访问器:

public class Client
{
    ... a lot of properties
    public List<Country> Countries { get; set; } 
}
Run Code Online (Sandbox Code Playgroud)

我对此解决方案的问题是我们仍然希望将此属性设置为虚拟.此优化仅对应用程序的特定部分是必需的,而在其他部分我们希望具有此延迟加载功能.

我不知道如何"通知"EF关于这个属性,这个属性已经通过这个Linq投影延迟加载了.那可能吗?如果没有,我们还有其他选择吗?的n + 1个问题使得应用到需要几秒钟来加载像1000行.

编辑 …

c# linq entity-framework

5
推荐指数
1
解决办法
1771
查看次数

标签 统计

c# ×1

entity-framework ×1

linq ×1