You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在EF数据库优先模式下为视图查询添加.AsNoTracking提速?

如何在EF数据库优先项目中为视图查询添加.AsNoTracking优化性能

没问题,针对你的场景,.AsNoTracking()确实能帮你提升查询视图的性能——因为你明确这个视图只用于查看,不需要EF跟踪实体的变更状态,这样EF就不用为这些实体维护额外的状态信息,减少内存占用和处理开销。

你只需要把.AsNoTracking()链式调用在你的查询语句中,位置可以放在Where之后,也可以直接放在DbSet调用之后,两种方式都有效,这里推荐放在DbSet后面更直观:

修改后的代码如下:

public static List<VitaminMovementView> FetchAll(DateTime fromDate, DateTime toDate) 
{ 
    var storeVitamins = new List<VitaminMovementView>(); 
    using (var cxt = new xxxEntities()) 
    { 
        storeVitamins.AddRange(
            cxt.VitaminMovementViews
               .AsNoTracking() // 在这里添加AsNoTracking
               .Where(x => x.Date >= fromDate && x.Date <= toDate)
               .OrderByDescending(sm => sm.VitaminMovementID)
        ); 
    } 
    return storeVitamins; 
}

补充说明:

  • 对于数据库优先生成的实体(包括视图对应的实体),EF默认会开启跟踪,所以即使是视图,只要通过DbSet查询,EF还是会尝试跟踪,.AsNoTracking()会强制关闭这个跟踪行为。
  • 如果你有批量查询只读数据的场景,这个方法几乎是必加的优化手段,尤其是数据量较大的时候,性能提升会更明显。

内容的提问来源于stack exchange,提问作者David B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:45:59