EF Core编译查询中AsNoTracking是否能正常生效?
关于EF.CompileAsyncQuery中AsNoTracking()有效性的确认
问题场景
现有编译查询代码:
private static readonly Func<LinkorDbContext, IAsyncEnumerable<Item>> _getFreeItemsQuery = EF.CompileAsyncQuery((LinkorDbContext dbContext) => dbContext.Items .Where(x => x.HttpClientSearch == ItemStatus.Free) .AsNoTracking() );
获取查询结果的代码:
public async Task<IReadOnlyCollection<Item>> Handle() { var list = new List<Item>(); await foreach(var item in _getFreeItemsQuery(_context)) { list.Add(item); } return list; }
需要确认上述编译查询中,AsNoTracking()是否能正常发挥作用。
回答
AsNoTracking()在这里是完全可以正常生效的。
EF.CompileAsyncQuery的作用是将整个LINQ查询表达式树编译为可重复执行的优化版本,表达式树中的所有操作(包括AsNoTracking())都会被保留并在执行时应用。编译后的查询执行时,会按照配置返回未被上下文跟踪的实体。
你可以通过简单验证确认这一点:在获取到item后,检查_context.Entry(item).State的状态,正常情况下应该返回EntityState.Detached,说明实体未被上下文跟踪,证明AsNoTracking()生效。
内容的提问来源于stack exchange,提问作者Ernest Rutherford
相关产品推荐
相关产品推荐

