在实体框架中排除所有内容(启用延迟加载)

时间:2015-10-13 19:04:59

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

在我的ASP.NET MVC应用程序中,我启用了实体框架的延迟加载。

这意味着当我使用例如

时,它会加载来自所有项目关系的所有数据
@using (MyApp.Models.ProjectsEntities db = new VodenjeDel.Models.ProjektiEntities()) {
    db.projects;
}

在某些情况下,我不想加载所有相关数据,我只需添加.Include(x => x.Colors),这意味着排除了除颜色之外的所有相关数据,因为如果没有使用包含,则会加载所有相关数据。

但在一些非常罕见的情况下,我想排除所有相关数据并仅从项目中获取数据。

我想使用类似的东西:

db.projects.Exclude(x => x.All);

但这不起作用。启用lazing加载后,正确的方法是什么?

2 个答案:

答案 0 :(得分:4)

我认为你有懒惰的装载工作有多困惑。如果您启用了延迟加载,那么当您尝试使用该属性时,您没有加载该属性的任何对象将会加载它。

使用.Include称为Eager loading,并且在抓取基础数据的同时抓取所请求的子项。

如果您不想要任何属性,那么只需调用基础对象,不要尝试访问任何子属性。

  

在我的MVC应用程序中,我实现了实体框架的Lazy加载   上。

     

这意味着当我加载所有项目关系中的所有数据时   使用例如。

这是不正确的。这将加载项目的所有基本属性。

当你尝试去访问子属性时,它会在那时进入并检索相关数据。

延迟加载DISABLED:

@using (MyApp.Models.ProjectsEntities db = new VodenjeDel.Models.ProjektiEntities()) {
    var results=db.projects.ToList();
    // results[0].Children is empty at this point
    var child=results[0].Children; // child is empty
}

延迟加载ENABLED:

@using (MyApp.Models.ProjectsEntities db = new VodenjeDel.Models.ProjektiEntities()) {
    var results=db.projects.ToList();
    // results[0].Children is empty at this point
    var child=results[0].Children; // This causes a DB lookup to get the children

}

急切加载:

@using (MyApp.Models.ProjectsEntities db = new VodenjeDel.Models.ProjektiEntities()) {
    var results=db.projects.Include(x=>Children).ToList();
    // results[0].Children is already in memory
    var child=results[0].Children; // This doesn't cause a DB lookup, and the data is returned from memory

}

答案 1 :(得分:3)

你可以随时禁用延迟加载..

{{1}}