2017-05-25 72 views
1

我得到以下情形有点糊涂了,实体框架:为什么DbSet <T>加载所有数据

  1. 我有模型“学生”
  2. 我SchoolContext类 - 公共财产DbSet学生{获取;集;}
  3. 服务,具有以下的代码行

    using(var context = new SchoolContext()) 
    { 
        var query = context.Students.Where(s => s.Gender =="M"); 
        var results = query.ToList(); 
    } 
    

在调试过程中,我将鼠标悬停在context.Students &扩展属性Results View并意识到所有学生已经加载了,无论过滤器和过滤器在何处被应用。

但我不确定是否在某个地方看到指示灯点亮时.ToList()一切仍然在IQueryable之下。因此,在这种情况下,var query应该是IQueryable而不加载任何数据,只需查询where条件和下一行,然后使用生成的查询命中数据库并仅返回所需的数据。

我是否缺少任何东西或将它与EF的任何其他概念混合?

+2

可能是因为调试器导致它执行 – haim770

+2

当你悬停在属性上时,你附加的调试器正在枚举'Students',在生产中这不会发生。 – Igor

+0

您的意思是,在实际的情况下,它会生成查询,然后加载数据?这是否只是因为调试造成的? – Kenz

回答

4

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

+2

这是不正确的。只有当你进入“结果视图”时,它才会执行查询。 –

+0

@CamiloTerevinto是的,你是对的,我错过了。添加到回答 – Backs

+0

@CamiloTerevinto,你是对的,我编辑了我的问题,其实与你说的话有关。 – Kenz

1

Visual Studio中加载所有的学生都适合你,当你想看看非过滤Students财产的调试器的值:

虽然在context.Students &调试,我鼠标悬停扩展性能结果查看

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

+2

这是不正确的。只有当你进入“结果视图”时,它才会执行查询。 –

+1

@CamiloTerevinto这正是我写的:*当你试图看到值* –