EF性能优化(一)
1、EF SQL監(jiān)控工具
目前采用SQLServer 自帶的SQL Server Profiler來監(jiān)控執(zhí)行的sql,或者采用第三方插件
MiniProfiler,具體用法可以網(wǎng)上查一下。
2、EF使用SQlQuery 直接寫sql
EF效率低于ADO.NET是因為LINQ-TO-SQL的過程消耗了時間。而使用SqlQuery則可以直接寫SQL語句。
當(dāng)然,如果你想得到更快的執(zhí)行速度,你也可以在數(shù)據(jù)庫上寫存儲過程proc
3、單純的數(shù)據(jù)查詢?
EF使用AsNoTracking(),無跟蹤查詢技術(shù)(查詢出來的數(shù)據(jù)不可以進行修改)
例如:
?var user = context.user.AsNoTracking().Where(A => A.Id == 1).FirstOrDefault() ;
? ? ? ? ? ? ? ? ? ? student.Name = "小明";
? ? ? ? ? ? ? ? ? ? context.SaveChanges();
?最終不會更新數(shù)據(jù)庫的信息,所以我們在做數(shù)據(jù)集合查詢顯示,而又不需要對集合修改并更新到數(shù)據(jù)庫的時候,
?一定不要忘記加上AsNoTracking。
?如果查詢過程做了select映射就不需要加AsNoTracking。
?如:db.user.Where(t=>t.Name.Contains("小明")).select(t=>new (t.Name,t.Age)).ToList();
4、 EF 使用 AsNonUnicode
示例:
?using (BingFaTestEntities context = new BingFaTestEntities())
? ? ?{
? ? ? ? var a = context.User.AsNoTracking().Where(m => m.Name == DbFunctions.AsNonUnicode("小明")).ToList();
? ? ?}
官方解釋:LINQ to Entities 運算符,它將輸入的字符串視為非 unicode 字符串。
此方法僅適用于 LINQ to Entities 查詢。
作用:不加AsNonUnicode SQL中會有 N,加了AsNonUnicode后,SQL中沒有N ,使用 N 前綴(查詢過程中需要把數(shù)據(jù)庫默認格式轉(zhuǎn)化為Unicode 格式來查詢,因此:性能被拉低)
當(dāng)然如果查詢包含中文字符等建議不要使用該方法
5、EF查詢多字段組合排序
如果涉及多個字段排序不要都是使用 OrderBy,應(yīng)該是第一個OrderBy后用ThenBy
示例:
?var list = db.User.Where(m => m.Name.StartsWith("明")).OrderBy(m => m.Number).ThenBy(m => m.Name).ToList();
6、EF count(*)的問題(Any的用法)
場景:查詢用戶表中是否有小明這個用戶
var flag1=db.User.Where(m=>m.Name=="小明").Count()>0
var flag2=db.User.Where(m=>m.Name=="小明").FirstOrDefault()!=null
var flag3=db.User.Any(m=>m.Name=="小明").Count()>0
經(jīng)過測試性能最高的是用Any 所以判斷是否存在盡量采用Any
7、EF的批量刪除和新增、修改
使用EF擴展 Entity Framework Extendeds
示例:db.User.AddRange(list);//批量插入
總結(jié)
- 上一篇: 在 Mac 端获取【网易云音乐】付费音乐
- 下一篇: 如何写出安全的API接口