我有一个关于Entity Framework性能的小问题。
类似这样的东西
类似这样的东西
using (MyContext context = new MyContext())
{
Document DocObject = context.Document.Find(_id);
int GroupCount = context.Document.Where(w=>w.Group == DocObject.Group).ToList().Count();
}
在我的数据库中(约30k个数据集),需要大约2秒钟,而这个则需要更长时间。
using (MyContext context = new MyContext())
{
Document DocObject = context.Document.Find(_id);
int GroupCount = context.Document.Where(w=>w.Group == DocObject.Group).Count();
}
需要 0.02 秒。
当我筛选出 10 个文件需要等待 20 秒时,我检查了我的代码,并将其更改为在 Count()
之前不使用 ToList()
。
有任何想法为什么这行代码加上 ToList()
后需要 2 秒钟?
ToList()
,第二个由于Count()
。区别在于第二个查询被优化为一个SELECT COUNT(*)
查询,这样会快得多。 - InBetweenDB
查询优化为SELECT COUNT(*)
查询,这一点在你的回答中没有提到。你只是提到了延迟加载、延迟执行和IQuerable<T>
,这与问题无关。在第二个选项中,Count()
也会立即执行查询并加载“对象”。不同之处在于查询已经在查询级别上进行了优化,因此返回一个单一值。 - InBetweenSELECT COUNT (*)
,否则,为了计数对象,它首先必须执行查询,就像使用ToList()
一样。为了计数,你需要遍历整个数据,否则你怎么做呢?Count()
急切地执行任何查询,就像ToList()
一样。如果你还不确定,只需使用内存中的对象进行调试即可。 - InBetween