Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架:为什么使用DbSet<;T>;加载所有数据_C#_Entity Framework_Linq - Fatal编程技术网

C# 实体框架:为什么使用DbSet<;T>;加载所有数据

C# 实体框架:为什么使用DbSet<;T>;加载所有数据,c#,entity-framework,linq,C#,Entity Framework,Linq,我对下面的场景有点困惑 我有一个“学生”模型 我有SchoolContext类-公共属性DbSet学生{get;set;} 服务,具有以下代码行 using(var context = new SchoolContext()) { var query = context.Students.Where(s => s.Gender =="M"); var results = query.ToList(); } 调试时,我将鼠标悬停在上下文上。学生&展开属性结果视图,并意识到

我对下面的场景有点困惑

  • 我有一个“学生”模型
  • 我有SchoolContext类-公共属性DbSet学生{get;set;}
  • 服务,具有以下代码行

    using(var context = new SchoolContext())
    {
        var query = context.Students.Where(s => s.Gender =="M");
        var results = query.ToList();
    }
    
  • 调试时,我将鼠标悬停在
    上下文上。学生
    &展开属性
    结果视图
    ,并意识到所有学生都已加载,而与应用的过滤器和过滤器后的位置无关

    然而,我不确定,我在某个地方读到,直到指针点击
    .ToList()
    为止,所有内容都保持在
    IQueryable
    下。所以在本例中,
    var query
    应该是
    IQueryable
    ,不加载任何数据,只查询where条件,然后下一行将使用生成的查询命中数据库并只返回所需的数据


    我是否遗漏了任何内容或将其与EF的任何其他概念混淆?

    当您尝试在调试器中查看未筛选的
    students
    属性的值时,Visual Studio正在为您加载所有学生:

    调试时,我将鼠标悬停在context.Students上,展开属性结果视图(&E)


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

    将鼠标放在
    上下文上。学生
    打开
    结果视图
    强制将数据从数据库加载到内存(需要在调试器中显示这些数据)。 所以,只有你的鼠标在上面才是原因。
    生产中的数据将按预期进行筛选。

    可能是因为调试器导致它执行。当您将鼠标悬停在属性上时,您所连接的调试器正在枚举学生。,在生产中不会发生这种情况。您的意思是,在实际场景中,它会生成查询,然后加载数据吗?这仅仅是因为调试导致的吗?“expand property Results View and Acrealized all Student(扩展属性结果视图,实现所有学生都已加载,而不考虑应用过滤器和过滤器后的位置)”,并且您完全忽略了警告,即单击lol将扩展enumerable。如果您将鼠标悬停在查询上并执行此操作,相同的结果将被过滤。在这里,您将鼠标悬停在整个未筛选的集合(学生)上,这是不正确的。只有当您进入“结果”视图时,它才会执行查询。@CamiloTerevinto是的,您是对的,我错过了它。添加到answer@CamiloTerevinto,你是对的,我编辑了我的问题,它实际上与你所说的有关。@AviKenjale现在这个问题更有意义了。将其视为VisualStudio功能,而不是代码中的bug。您甚至可以使用即时窗口来运行自定义查询,而无需运行实际代码;)@Camiloterevento,是否有办法在
    IQueryable
    对象下的某个地方查看生成的SQL。这是错误的。只有当您进入“结果”视图时,它才会执行查询。@CamiloTerevinto这正是我写的:当您试图查看值时