前言
EF相信大部分同学都已经经常使用了,可是你的查询高效吗?
今天我就以个人使用经验来讲讲在使用EF做查询的时候大家都容易忽略的性能提升点。
本文将继续接着上一篇(EF使用CodeFirst方式生成数据库&技巧经验)来写
数据准备
查询监视
EF生成的sql语句是什么样子的呢?我们有多种方式查看到。
- 通过SQL Server Profiler来监控执行的sql语句
- 使用插件MiniProfiler来监控执行的sql语句
测试代码:
var profiler = MiniProfiler.Current;
using (profiler.Step("查询第一条班级的数据数据"))
{
using (var db = new Core.EF.MyDbContext())
{
var classes= db.T_Classes.Where(c => true).FirstOrDefault();
}
}
测试结果如下:
延迟加载的开关
默认情况下延迟加载是开启的,我们可以通过如下两种方式设置是否开启延迟加载。
- 第一种在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;
}
2.打开延迟加载,查询结果如下:
当我们需要使用子表数据时需要打开延迟加载
using (var db = new Core.EF.MyDbContext())
{
var classes= db.T_Student.Where(c => true).FirstOrDefault();
int a = 3;
}
延迟加载时使用Include提高性能
使用Include的两大前提
- 开启延迟加载
- 在使用Include的类上using System.Data.Entity;
不使用Include的情况
代码:
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;
}
}