实体框架5数据库请求

时间:2013-09-28 07:45:41

标签: entity-framework-5

我理解为什么第一个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所示?

1 个答案:

答案 0 :(得分:0)

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

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