关于EF框架查询效率的疑惑
using (var edm = new testEntities())
{
System.Data.Entity.DbSet<ClassInfo> TwoCols = edm.ClassInfo;
//foreach (test1 c in TwoCols)
//{
//}
// ViewBag.Message = TwoCols.Count();
}
表ClassInfo中有1千万条数据,
System.Data.Entity.DbSet<ClassInfo> TwoCols = edm.ClassInfo;这个语句相当于
select * from ClassInfo,如果在数据库中直接用select * from ClassInfo需要好几分钟,为什么在页面中用System.Data.Entity.DbSet<ClassInfo> TwoCols = edm.ClassInfo;反而页面直行得很快?
我看过TwoCols.Count()的确是1千万,为什么用System.Data.Entity.DbSet<ClassInfo> TwoCols = edm.ClassInfo查1千万条数据会这么快,几乎1-2秒就出来了。
本要刚接触EF,还望有经验的各位解答。
------解决方案--------------------
不是,这时候还未从数据库里拿数据,只有在foreach循环里有取/赋值(相当于reader)或者tolist(全部获取)的时候才会进行数据库操作,同理的还有firstordefault(相当于top 1)
------解决方案--------------------System.Data.Entity.DbSet<ClassInfo> TwoCols = edm.ClassInfo; //这行耗时0秒
TwoCols.Count();//执行命令 相当于select COUNT(*) from ClassInfo
------解决方案--------------------ps:
System.Data.Entity.DbSet<ClassInfo> TwoCols = edm.ClassInfo;这个语句相当于
select * from ClassInfo
呵呵,我不知道你从什么地方得到这个结论滴,你应该知道EF是延迟查询滴,你这个东西的到滴并不是select * from ClassInfo,而是IQueryable<ClassInfo>,具体滴sql执行,是根据你后面的方法得到滴(比如where,比如order,后面跟什么sql才解释成什么)
当然还是我上面说滴,优先实现,优先最小化,你管他xxoo滴性能做什么,俺们是第一线程序员,俺们不是博客园上那些喜欢矫情滴学院派,事实上说你这样没有明显问题,那么ok,如果事实上有问题,那么既然功能最小化,那怕你自己在这里用EF直接执行sql语句,有问题么??
------解决方案--------------------生成的是
SELECT TOP (1000) [T0].*
FROM [SKU] AS [t0]
ORDER BY [t0].[Id]