优化的地方:


  ①:如果仅是查询数据,并不对数据进行增、删、改操作,查询数据的时候可以取消状态追踪。



db.TestInfor.AsNoTracking().FirstOrDefault();


  ②:用什么查什么,比如一张表有100多个字段,本次业务只需要5个字段,一定是select这5个字段,然后toList,而不是全部查询,再toList()。

  ③:利用EF调用原生SQL语句或者EF调用存储过程执行。

 

 

 

EF数据查询效率对比:


1、实质:没有连表



var scores = db.Scores.Take(5).ToList();
foreach (var item in scores)
{
var name = item.Student.Name;//每次循环 都会产生一条sql
}


2、实质:连了表Student。

  使用Include需要引用命名空间 using System.Data.Entity;

  缺陷:连表时,会把子表的字段全部查询出来



var scores = db.Scores.Take(5).Include(c => c.Student).ToList();
foreach (var item in scores)
{
var name = item.Student.Name;
}
使用 .Include(c => c.Student) 需要引用 System.Data.Entity;


3、减少了 内存存储空间 和 应用程序与数据库的数据传输带宽。

  实质:SQL查询的字段变少了

  缺陷:一个字段一个字段的手动映射



var scores = db.Scores
.Take(5)
.Include(c => c.Student)
.Select(c => new { c.ChineseFraction, c.CreateTime, StudentName = c.Student.Name })
.ToList();
foreach (var item in scores)
{
var name = item.StudentName;
}


4、避免在循环中访问导航属性多次执行sql语句。

   避免了查询语句中太多的手动映射,影响代码的阅读。



Mapper.Initialize(x => x.CreateMap<Score, ScoresDto>());//CreateMap应该是要写到Global.asax文件里面的
var scores = db.Scores
.Take(5)
.ProjectTo<ScoresDto>()//需引用:using AutoMapper.QueryableExtensions;
.ToList();
foreach (var item in scores)
{
var name = item.Student.Name;
}