You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:52:14