EF Core AsNoTracking怎么用 EF Core AsNoTracking提升性能方法

月夜之吻
发布: 2025-12-17 08:15:53
原创
944人浏览过
AsNoTracking是提升EF Core只读查询性能最直接的方法,适用于查后不修改的场景,如列表页、报表、分页接口和数据导出;需在执行前调用,配合Select投影效果更佳,也可全局默认关闭跟踪。

ef core asnotracking怎么用 ef core asnotracking提升性能方法

EF Core 的 AsNoTracking 是提升只读查询性能最直接、最常用的方法之一。它不改变业务逻辑,只需加一个方法调用,就能显著降低内存开销和查询耗时——尤其在列表页、报表、API数据导出等场景下效果明显。

什么时候该用 AsNoTracking

只要满足“查出来只读、不改、不删、不提交”,就该用。典型场景包括:

  • 后台管理系统的用户列表、订单列表页
  • 数据看板、统计报表的原始数据拉取
  • 前端分页接口返回的 JSON 数据
  • 导出 Excel 或生成 PDF 所需的只读数据集

怎么写才正确

直接链式调用 .AsNoTracking(),放在 Where/OrderBy/Include 等操作之前或之后都可(推荐放前面,语义更清晰):

✅ 正确写法(推荐):

var blogs = context.Blogs
    .AsNoTracking()
    .Where(b => b.CreatedOn > DateTime.Today.AddDays(-7))
    .OrderByDescending(b => b.CreatedOn)
    .ToList();
登录后复制

❌ 错误写法(无效):

// AsNoTracking 必须在 ToList() / FirstOrDefault() 等执行前调用
var blogs = context.Blogs.ToList().AsNoTracking(); // ❌ 编译失败!
登录后复制

搭配投影(Select)效果翻倍

AsNoTracking 解决的是“跟踪开销”,而 Select 投影 解决的是“数据冗余”。两者合用,才是完整优化:

Notion Sites
Notion Sites

Notion 推出的AI网站构建工具,允许用户将 Notion 页面直接发布为完整网站。

Notion Sites 246
查看详情 Notion Sites
  • 避免 SELECT *:只取 Id、Title、Status 这类真正需要的字段
  • 生成的 SQL 更轻,网络传输更少,GC 压力更低
  • 还能绕过实体映射,连 DbContext 都不用实例化对应类型

示例:

var blogDtos = context.Blogs
    .AsNoTracking()
    .Where(b => b.IsActive)
    .Select(b => new { b.Id, b.Title, b.Url })
    .ToList();
登录后复制

全局默认关闭跟踪(适合读多写少系统)

如果项目中 80% 以上是只读查询,可在 DbContext 配置中设为默认不跟踪:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder
        .UseSqlServer(connectionString)
        .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
}
登录后复制

这样所有查询都自动不跟踪,需要更新时再显式加 .AsTracking()

var blog = context.Blogs.AsTracking().First(b => b.Id == 123);
blog.Title = "New Title";
context.SaveChanges(); // ✅ 此时能正常更新
登录后复制

基本上就这些。不复杂但容易忽略——多数性能瓶颈,其实就卡在没加这一行 .AsNoTracking()

以上就是EF Core AsNoTracking怎么用 EF Core AsNoTracking提升性能方法的详细内容,更多请关注php中文网其它相关文章!

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号