码迷,mamicode.com
首页 > 其他好文 > 详细

Linq查询IEnumerable与IQueryable

时间:2014-09-11 13:44:01      阅读:291      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   ar   for   数据   2014   

 

 class Program
    {
        static void Main(string[] args)
        {
            System.Diagnostics.Stopwatch stp = new Stopwatch();

            stp.Start();
            
            DBCommonContext db = new DBCommonContext();
            var usser_First = db.tbUsers.Where(p => p.UserID > 0);//.AsEnumerable();
            var users_Now = usser_First.Where(p => p.ModifyDate > new DateTime(2012, 8, 2)); //断点
            foreach (var user in users_Now)
            {//断点
                Console.WriteLine(user.UserName + "\n");

            }

            stp.Stop();
            Console.WriteLine("IQueryable执行时间:" + stp.Elapsed.ToString()+"\n");
            stp.Reset();
            
            Console.ReadKey();


        }
    }

 

设置好断点,打开SQL Profiler。分别对两个跟踪,可以看到到第一个断点的时候都还没有去SQL拿数据:

 

bubuko.com,布布扣

 

都是延迟执行,从SQL Profiler可以看出都是到foreach才去拿数据。

①、IEnumerable下执行的语句,可以看到去SQL加载过来的是第一个条件下的所有数据,然后扩展方法筛选。本质Linq2object,数据量略大内存占用多,响应速度也略快。

 

bubuko.com,布布扣

 

②、IQueryable下的结果,是根据语法书整个合并成sql查询到结果。本质linq2sql,耗损小,但查询效率略慢

bubuko.com,布布扣

 

直接总结:

linq延后执行不说了。个人理解

IEnumerable:在调用自己的Where、SKip 、Take 等扩展方法之前数据就已经加载在本地内存里了。如上按第一个条件直接SQL加载到内存后,再自身执行第二个条件的数据。所以它传输的数据量比较大,所以会有更多的无用功。本质Linq2Object,额外带宽耗损大但速度快占内存。

IQueryable:是通过语法树完全转换成一个T-sql语句,最后SQL拿到结果集。只加载需要的数据。本质Linq2SQL。耗损小速度略慢。

选择哪个的问题其实是远程从sql加载数据和本地加载筛选数据的取舍

 

Linq查询IEnumerable与IQueryable

标签:style   blog   http   color   os   ar   for   数据   2014   

原文地址:http://www.cnblogs.com/xmai/p/3964899.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!