如何在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
相关产品推荐
相关产品推荐

