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,如果数据量大(十万以上)查询速度回慢;耗内存
建议:数据量小的时候建议用

浙公网安备 33010602011771号