实体框架:为什么DbSet <t>加载所有数据

时间:2017-05-25 15:16:53

标签: c# entity-framework linq

我对以下情景感到困惑,

  1. 我有模特&#39;学生&#39;
  2. 我有SchoolContext类 - 公共属性DbSet Students {get; set;}
  3. 服务,包含以下代码行

    $('#hiddendiv').css({"display":"inline"})
    
  4. 调试时,我将鼠标悬停在using(var context = new SchoolContext()) { var query = context.Students.Where(s => s.Gender =="M"); var results = query.ToList(); } &amp;展开属性context.Students并意识到所有学生已经加载,无论过滤器和过滤器 - 在哪里被应用。

    但是,我不确定,在某个地方,直到指针点击Results View,所有内容都会保留在.ToList()之下。所以在这种情况下IQueryable应该是var query而不加载任何数据,只是查询where条件和下一行然后将使用生成的查询命中数据库并返回所需的数据。

    我是否遗漏了任何内容或将其与任何其他EF概念混合在一起?

2 个答案:

答案 0 :(得分:4)

将鼠标悬停在context.Students上并打开Results View强制数据从数据库加载到内存(需要在调试器中显示这些数据)。 所以,只有你的鼠标是原因。 在生产中,数据将按预期过滤。

答案 1 :(得分:1)

当您尝试在调试器中查看未过滤的Students属性的值时,Visual Studio会为您加载所有学生:

  

调试时,我将鼠标悬停在上下文上。学生和学生展开属性结果视图

在您尝试评估之前,所有内容都会保持在IQueryable之下。当您调用某个执行查询并执行数据库往返的方法时会发生这种情况 - ToList()Count()等。或者当您尝试在Visual Studio调试器中枚举值时会发生这种情况。