日期:2014-05-20  浏览次数:20794 次

关于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,还望有经验的各位解答。

------解决方案--------------------
引用:
你所说的延迟加载的是个什么样的概念,执行了 System.Data.Entity.DbSet<ClassInfo> TwoCols = edm.ClassInfo;
是不是一口气把表ClassInfo中的数据一口气都读到内存里了?

不是,这时候还未从数据库里拿数据,只有在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]