前言

EF相信大部分同学都已经经常使用了,可是你的查询高效吗?

今天我就以个人使用经验来讲讲在使用EF做查询的时候大家都容易忽略的性能提升点。

 本文将继续接着上一篇(EF使用CodeFirst方式生成数据库&技巧经验)来写

数据准备

View Code

 

查询监视

EF生成的sql语句是什么样子的呢?我们有多种方式查看到。 

  1. 通过SQL Server Profiler来监控执行的sql语句
  2. 使用插件MiniProfiler来监控执行的sql语句

 MiniProfiler的具体使用请点击查看

 

测试代码:

EF查询之性能优化技巧
 var profiler = MiniProfiler.Current;
            using (profiler.Step("查询第一条班级的数据数据"))
            {
                using (var db = new Core.EF.MyDbContext())
                {
                    var classes= db.T_Classes.Where(c => true).FirstOrDefault();

                }
            }
EF查询之性能优化技巧

测试结果如下:

 EF查询之性能优化技巧

 

延迟加载的开关

 默认情况下延迟加载是开启的,我们可以通过如下两种方式设置是否开启延迟加载。

  1. 第一种在dbcontex中设置:
 public MyDbContext(System.Data.Common.DbConnection oConnection)
            : base(oConnection, true)
        {
            this.Configuration.LazyLoadingEnabled = true;         
        }

  2.第二种在使用DbContext的时候设置:

 using (var db = new Core.EF.MyDbContext())
                {
                    db.Configuration.LazyLoadingEnabled = false;
                    var classes= db.T_Student.Where(c => true).FirstOrDefault();
                    int a = 3;
                }

延迟加载开启和关闭的结果测试

1.当关闭延迟加载的时候我们查不到对应表的关联表中的数据,如上,我们在查询学生表的数据时关闭了延迟加载,查询结果如下:

当我们不需要使用子表的数据时,我们可以选择关闭延迟加载

 using (var db = new Core.EF.MyDbContext())
                {
                    db.Configuration.LazyLoadingEnabled = false;
                    var classes= db.T_Student.Where(c => true).FirstOrDefault();
                    int a = 3;
                }

 

EF查询之性能优化技巧

2.打开延迟加载,查询结果如下:

当我们需要使用子表数据时需要打开延迟加载

using (var db = new Core.EF.MyDbContext())
                {                    
                    var classes= db.T_Student.Where(c => true).FirstOrDefault();
                    int a = 3;
                }

EF查询之性能优化技巧

 

延迟加载时使用Include提高性能

使用Include的两大前提

  1. 开启延迟加载
  2. 在使用Include的类上using System.Data.Entity;

不使用Include的情况

代码:

EF查询之性能优化技巧
 var profiler = MiniProfiler.Current;
            using (profiler.Step("查询第一条班级的数据数据"))
            {
                using (var db = new Core.EF.MyDbContext())
                {
                    var students = db.T_Student.Where(c => true).Take(5).ToList();
                    foreach (var item in students)
                    {
                        var c = item.T_Classes;
                    }
                    int a = 3;
                }
            }
EF查询之性能优化技巧

相关文章: