【问题标题】:Does using AsNoTracking() make a difference when only returning fields?仅返回字段时使用 AsNoTracking() 会有所不同吗?
【发布时间】:2014-02-13 13:15:44
【问题描述】:

所以我已经阅读了很多关于在 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);

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。有关如何观察正在跟踪的更改的有用信息。我以前不知道。
    猜你喜欢
    • 2017-11-26
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 2021-09-19
    相关资源
    最近更新 更多