我理解为什么第一个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所示?
答案 0 :(得分:0)
第一个示例中的ToList调用指示EF从数据库中读取所有对象并将其转换为内存中的列表。 然后迭代这个列表。
在第二个循环中,您要查询数据库5次。 每次foreach循环调用DbSet上的GetEnumerator时,它都会查询数据库。 实体框架无法知道自上次执行GetEnumerator以来没有对数据库进行任何更改,因此需要进行5次数据库读取。