提高查询速度?

问题描述 投票:0回答:1

我正在尝试提高查询的性能。

我正在考虑使用

AsNoTracking()
,但我不确定它放置的位置是否会产生影响,即(在
Select()
之前或之后,在
Include()
之前或之后,在
ToList()
之前或之后)。

我还阅读了有关

_context.ChangeTracker.Clear()
的内容,它会阻止 EF 跟踪实体的更改。

那么使用它会让我的查询更快吗?

var checklist = await _context.SiteCategory
                              .Include(s => s.Sites)
                              .Include(s => s.TAudits)
                              .AsNoTracking()
                              .ToListAsync();

_context.ChangeTracker.Clear();
sql asp.net entity-framework linq optimization
1个回答
0
投票

AsNoTracking()
_context.ChangeTracker.Clear()
的放置可能会影响查询的性能以及实体框架 (EF) 管理跟踪实体的方式。不过,使用它们是否会让你的查询更快取决于具体的场景和需求。

以下是对每一项的解释以及它们如何影响性能:

  1. AsNoTracking()
    :此方法用于指示从数据库检索的实体不应被 EF 上下文跟踪。这意味着 EF 不会跟踪对这些实体所做的更改,并且在您保存更改时不会为它们生成更新语句。它可以提高查询性能,因为 EF 不需要维护这些实体的状态。

    • AsNoTracking()
      放在
      Select()
      Include()
      ToList()
      之前会影响查询检索到的所有实体。它通常应用于整个查询结果。

    • 当您不打算修改实体并希望提高查询性能时,请使用

      AsNoTracking()

  2. _context.ChangeTracker.Clear()
    :此方法从 EF 上下文的更改跟踪器中清除所有跟踪的实体。当您想要从上下文中分离实体以防止意外更改或释放内存时,它会很有用。

      在完成对实体的处理后(例如,在
    • _context.ChangeTracker.Clear()

      之后)放置

      ToList()
      是将它们与上下文分离的好习惯。这可以帮助减少内存使用并防止跟踪更改。
      
      

    • 它通常不用于提高查询性能,而是用于内存管理和防止对实体的无意更改。
  3. 使用这些方法是否会让您的查询更快取决于您的具体用例:

    如果您不需要跟踪实体的更改并且仅读取数据,则使用
  • AsNoTracking()

    可以通过避免更改跟踪的开销来提高查询性能。

    
    

  • _context.ChangeTracker.Clear()

    更多的是关于内存管理和避免意外更改而不是查询性能。当您使用完实体后,将它们从上下文中分离出来是一个很好的做法。

    
    

  • 总之,您可以使用
AsNoTracking()

_context.ChangeTracker.Clear()
来提高查询性能和管理实体,但它们的位置应符合您有关更改跟踪和内存管理的特定要求。
    

© www.soinside.com 2019 - 2024. All rights reserved.