0

我明白为什么第一个 for 循环会产生一个对数据库的请求,但为什么第二个 for 循环会产生 5 个对数据库的请求?

class Program
{


    static void Main(string[] args)
    {

        TAXIDBEntities1 ctx = new TAXIDBEntities1();
        List<TestObject> Tests;

        //This block makes 1 requests to database

      Tests = ctx.TestObjects.ToList();
      for (int i = 0; i < 5; i++)
      {
          foreach (TestObject item in Tests)
          {
              System.Diagnostics.Debug.WriteLine(item.id);
          }
          System.Threading.Thread.Sleep(2000);
      }

        //This block makes 5 requests to database

      var x = ctx.TestObjects;
      for (int i = 0; i < 5; i++)
      {
          foreach (TestObject item in x)
          {
              System.Diagnostics.Debug.WriteLine(item.id);
          }
          System.Threading.Thread.Sleep(2000);

      }





    }





}

我不明白第二个 for 循环中发生了什么。有人可以解释为什么数据库有 5 个请求,如 Sql profiler 中所示?

4

1 回答 1

0

第一个示例中的 ToList 调用指示 EF 从数据库中读取所有对象并将它们转换为内存中的列表。然后你遍历这个列表。

在第二个循环中,您查询数据库 5 次。每次 foreach 循环在 DbSet 上调用 GetEnumerator 时,它都会查询数据库。Entity Framework 无法知道自上次执行 GetEnumerator 以来没有对数据库进行任何更改,因此它需要进行 5 次数据库读取。

于 2013-09-28T10:31:37.513 回答