IQueryable、IEnumerable、List的区别

ORM:EF,linq to EF,SQL Server Profiler监控SQL

IQueryable:

        static void fun1()
        {
            using (var db=new DB_TestEntities())
            {
                IQueryable<ActGift_J> act = db.ActGift_J.Where(m => m.ActID == 1);
                int count = act.Count();
                List<ActGift_J> data1 = act.OrderBy(m=>m.GiftID).Skip(0).Take(10).ToList();
                List<ActGift_J> data2 = act.Where(m => m.GiftName.Contains("手机")).ToList();
            }
        }

结果:执行了3次SQL,

第一次是查   int count = act.Count();

第二次是查 List<ActGift_J> data1 = act.OrderBy(m=>m.GiftID).Skip(0).Take(10).ToList();

第三次是查 List<ActGift_J> data2 = act.Where(m => m.GiftName.Contains("手机")).ToList();

结论:IQueryable是延迟查询,IQueryable对象只是生产SQL表达式,每次操作IQueryable对象都会执行一次SQL!

IEnumerable:

        static void fun2()
        {
            using (var db = new DB_TestEntities())
            {
                IEnumerable<ActGift_J> act = db.ActGift_J.Where(m => m.ActID == 1).OrderBy(m => m.GiftID).AsEnumerable();
                int count = act.Count();
                var data1 = act.Skip(0).Take(10);
                var data2 = act.Where(m => m.GiftName.Contains("手机"));
            }
        }

结果:执行这行代码“IEnumerable<ActGift_J> act = db.ActGift_J.Where(m => m.ActID == 1).OrderBy(m => m.GiftID).AsEnumerable();”的时候没收执行SQL,

执行“int count = act.Count();”的时候执行了一次SQL,最后的两行代码没有执行SQL:

  

结论:IEnumerable是也延迟查询,当第一次调用到IEnumerable对象的时候回执行SQL保存在内存中,然后后面调用的所有IEnumerable对象都会在内存中操作。

 

List:

        static void fun3()
        {
            using (var db = new DB_TestEntities())
            {
                List<ActGift_J> act = db.ActGift_J.Where(m => m.ActID == 1).ToList();
                int count = act.Count();
                var data1 = act.OrderBy(m => m.GiftID).Skip(0).Take(10);
                var data2 = act.Where(m => m.GiftName.Contains("手机"));
            }
        }

 结果:执行这行代码“List<ActGift_J> act = db.ActGift_J.Where(m => m.ActID == 1).ToList();”的时候就执行了SQL,后面的三行代码都没有执行SQL

        

 

结论:List是即时查询,保存在内存中,此后的List对象都是在内存中操作。

 

最终结论:

IQueryable是延迟查询,每次调用IQueryable对象的时候,都会执行对应的SQL。

  优点:因为调用的时候再拼接SQL,然后查询到的数据量不是很大,查询速度快。

  缺点:每次调用都会访问一次数据库,会增加数据库的负担。

  建议:数据量大的时候建议用

 

IEnumerable是延迟查询,第一次调用IEnumerable对象的时候就执行初始定义的SQL,然后再内存中操作  

List是即时查询,初始化的时候就执行对应的SQL保存在内存中

  优点:只访问一次数据库;内存操作,速度快

  缺点:第一次调用或者初始化的时候就执行SQL,如果数据量大(十万以上)查询速度回慢;耗内存

  建议:数据量小的时候建议用

posted @ 2017-04-23 01:44  花生打代码会头痛  阅读(168)  评论(0)    收藏  举报