只返回字段时使用AsNoTracking()会有所不同吗?

Rob*_*ack 9 c# linq entity-framework

所以我在EF中执行查询时已经阅读了很多关于使用AsNoTracking()的内容,特别是如果它返回实体,以便在不更新的情况下不保留对事物的引用.

但我也读到AsNoTracking也可以加速查询本身,因为EF不必将查询的每个项目映射到地图中的实体.

问题是,如果我的Linq查询只返回列/行中的值而不是实体类型,那么使用AsNoTracking()是否会加快查询速度?如果不是很明显我不应该使用它,因为它只会使代码混乱?

示例1(我希望使用AsNoTracking():

var result = (from p in context.Pogs
              select p).AsNoTracking();
Run Code Online (Sandbox Code Playgroud)

例2(我的问题......我认为在这里使用没有意义,但我不知道答案):

var result = (from p in context.Pogs
              select p.Name);  // assuming p.Name is a string or something
Run Code Online (Sandbox Code Playgroud)

var result = (from p in context.Pogs.AsNoTracking()
              select p.Name);
Run Code Online (Sandbox Code Playgroud)

jno*_*ovo 5

不,它不会,因为实体将不会被加载,context.Pogs.Local这可以通过检查哪些实体不包含通过LINQ检索其属性的实体来证明.

您可以检查正在跟踪的实体DbContext.ChangeTracker.因此,如果您DbSet通过context.ChangeTracker.Entries<Pogs>()您的Pogs检索跟踪器的条目,您将看到第一个示例中有条目跟踪相应的实体,而第二个示例则没有.

  • 谢谢。有关如何观察正在跟踪的更改的有用信息。我以前不知道这一点。 (2认同)