優化的地方:
原地址:https://www.cnblogs.com/yaopengfei/p/9226328.html
①:如果僅是查詢數據,並不對數據進行增、刪、改操作,查詢數據的時候可以取消狀態追蹤。
db.TestInfor.AsNoTracking().FirstOrDefault();
②:用什么查什么,比如一張表有100多個字段,本次業務只需要5個字段,一定是select這5個字段,然后toList,而不是全部查詢,再toList()。
③:利用EF調用原生SQL語句或者EF調用存儲過程執行。
EF數據查詢效率對比:
原地址:https://www.cnblogs.com/zhaopei/p/5721789.html
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; }