随笔 - 33, 文章 - 0, 评论 - 148, 阅读 - 92564
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

ado.net entity framework 查询性能比较

Posted on   ghwghw  阅读(7425)  评论(5编辑  收藏  举报

关于ado.net entity framework 性能比较网上也有很多,这里我只是初步的介绍下ado.net entity framework使用不同的方法查询数据的不同性能

第一部分:重复查询单个实体

第一种:Linq To Entitiess

代码如下:

  static void Main(string[] args)
        {
            DateTime time1;
            DateTime time2;
            time1 = DateTime.Now;
            NorthwindEntities context = new NorthwindEntities();
            for (int i = 0; i < 1000; i++)
            {
                var data = (from c in context.Customers where c.CustomerID == "ALFKI" select c).FirstOrDefault();
                string addr = data.Address;
            }
            time2 = DateTime.Now;
            Console.WriteLine((time2-time1).ToString());
        }

查询使用时间为6.2秒左右

第二种:使用Entity SQL

  static void Main(string[] args)
        {
            DateTime time1;
            DateTime time2;
            time1 = DateTime.Now;
            NorthwindEntities context = new NorthwindEntities();
            for (int i = 0; i < 1000; i++)
            {
                var data = context.Customers.Where("it.CustomerID=@Id", new System.Data.Objects.ObjectParameter("Id", "ALFKI")).FirstOrDefault();
                string addr = data.Address;
            }
            time2 = DateTime.Now;
            Console.WriteLine((time2-time1).ToString());
        }

查询使用时间为6.2秒左右

第三种:使用EntityKey 来查询

 static void Main(string[] args)
        {
            DateTime time1;
            DateTime time2;
            time1 = DateTime.Now;
            NorthwindEntities context = new NorthwindEntities();
            for (int i = 0; i < 1000; i++)
            {
                var data = context.GetObjectByKey(new System.Data.EntityKey("NorthwindEntities.Customers", "CustomerID", "ALFKI")) as Customers;
                string addr = data.Address;
            }
            time2 = DateTime.Now;
            Console.WriteLine((time2-time1).ToString());
        }

查询使用时间为1秒,没错是一秒

总结:

前两种方法查询所使用的时间都差不多为6.2秒,时间比较长,但是使用第三种方法查询数据仅仅使用了1秒,为什么会相差那么多,区别在于前两种方法每次查询都要从数据库中查找,1000次查询每次的查询时间都一样,但是第三种方法只有第一次是从数据库中查数据,后面的999次都是在context通过主键直接取数据,速度当然会快很多啦,EF4.0之前的实体当含有外键引用时是自动生成对象引用的,而EF4.0现在多了一个外键ID,这样我们可以很方便的通过外键来查询数据

第二部分:查询不同是实体

第一种:Linq To Entitiess

 static void Main(string[] args)
        {
            DateTime time1;
            DateTime time2;
            NorthwindEntities context = new NorthwindEntities();
            //先将Customers所有的主键查询出来
            List<string> keys = context.Customers.Select(c => c.CustomerID).Distinct().ToList();
            //和上面的context以作区别
            NorthwindEntities  context_ = new NorthwindEntities();
            time1 = DateTime.Now;
            foreach (var key in keys)
            {
                var data = context_.Customers.Where(c => c.CustomerID == key).FirstOrDefault();
                string addr = data.Address;
            }
            time2 = DateTime.Now;
            Console.WriteLine((time2 - time1).ToString());
        }

查询使用时间0.68秒左右

第二种:使用Entity SQL

static void Main(string[] args)
        {
            DateTime time1;
            DateTime time2;
            NorthwindEntities context = new NorthwindEntities();
            //先将Customers所有的主键查询出来
            List<string> keys = context.Customers.Select(c => c.CustomerID).Distinct().ToList();
            //和上面的context以作区别
            NorthwindEntities  context_ = new NorthwindEntities();
            time1 = DateTime.Now;
            foreach (var key in keys)
            {
                var data = context_.Customers.Where("it.CustomerID=@Id", new System.Data.Objects.ObjectParameter("Id", key)).FirstOrDefault();
                string addr = data.Address;
            }
            time2 = DateTime.Now;
            Console.WriteLine((time2 - time1).ToString());
        }

查询使用时间0.5秒左右

第三种:使用EntityKey 来查询

  static void Main(string[] args)
        {
            DateTime time1;
            DateTime time2;
            NorthwindEntities context = new NorthwindEntities();
            //先将Customers所有的主键查询出来
            List<string> keys = context.Customers.Select(c => c.CustomerID).Distinct().ToList();
            //和上面的context以作区别
            NorthwindEntities  context_ = new NorthwindEntities();
            time1 = DateTime.Now;
            foreach (var key in keys)
            {
                var data = context_.GetObjectByKey(new System.Data.EntityKey("NorthwindEntities.Customers", "CustomerID", key)) as Customers;
                string addr = data.Address;
            }
            time2 = DateTime.Now;
            Console.WriteLine((time2 - time1).ToString());
        }

查询时间为0.18秒左右

总结:

通过比较第三种方法仍然比前两种来的快,查询效率更高

 

使用EntityKey来查询数据比其他两种方法来的更快,而且不是快一点点,而是相差有好几倍,这里的比较并没有使用存储过程来比较查询,但是从这里我们可以看出,在平常的应用中如果知道实体的主键尽量用主键来查询

 

 

 

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示