EF性能优化(一)
1、EF SQL监控工具
目前采用SQLServer 自带的SQL Server Profiler来监控执行的sql,或者采用第三方插件
MiniProfiler,具体用法可以网上查一下。
2、EF使用SQlQuery 直接写sql
EF效率低于ADO.NET是因为LINQ-TO-SQL的过程消耗了时间。而使用SqlQuery则可以直接写SQL语句。
当然,如果你想得到更快的执行速度,你也可以在数据库上写存储过程proc
3、单纯的数据查询
EF使用AsNoTracking(),无跟踪查询技术(查询出来的数据不可以进行修改)
例如:
var user = context.user.AsNoTracking().Where(A => A.Id == 1).FirstOrDefault() ;
student.Name = "小明";
context.SaveChanges();
最终不会更新数据库的信息,所以我们在做数据集合查询显示,而又不需要对集合修改并更新到数据库的时候,
一定不要忘记加上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 前缀(查询过程中需要把数据库默认格式转化为Unicode 格式来查询,因此:性能被拉低)
当然如果查询包含中文字符等建议不要使用该方法
5、EF查询多字段组合排序
如果涉及多个字段排序不要都是使用 OrderBy,应该是第一个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
经过测试性能最高的是用Any 所以判断是否存在尽量采用Any
7、EF的批量删除和新增、修改
使用EF扩展 Entity Framework Extendeds
示例:db.User.AddRange(list);//批量插入
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)