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

时间:2014-02-11 14:11:50

标签: c# linq entity-framework

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

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

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

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

var result = (from p in context.Pogs
              select p).AsNoTracking();

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

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

var result = (from p in context.Pogs.AsNoTracking()
              select p.Name);

1 个答案:

答案 0 :(得分:5)

不,它没有,因为实体不会被加载,正如检查context.Pogs.Local所证明的那样,它不包含通过LINQ检索其属性的实体。

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