如何找出在请求处理期间执行了多少 EF Core 查询

How to find out how many EF Core queries are executed during an request processing

我们有一个 ASP.NET Core 5.0 和 EF Core 5.0 项目。我们想要实现一个查询计数器,它会查看在 API 执行期间针对数据库执行了多少 EF Core 查询。 DbContext 使用 ASP.NET DI 和 AddScoped 方法注入控制器。

有人知道如何实现吗?也许使用 EF Core 拦截器或其他东西?

最简单的方法是使用 IDbCommandInterceptor 创建从 DbCommandInterceptor 派生的 class。它应该是线程安全的。

public class MyCommandInterceptor : DbCommandInterceptor
{
    public IMyStatistics Statistics { get; }

    public MyCommandInterceptor(IMyStatistics statistics)
    {
        Statistics = statistics ?? throw new ArgumentNullException(nameof(statistics));
    }

    public override DbCommand CommandCreated(CommandEndEventData eventData, DbCommand result)
    {
        Statistics.IncrementCommandCount();
        return base.CommandCreated(eventData, result);
    }
}

使用IMyStatistics界面收集数据。实现也应该是线程安全的。

public interface IMyStatistics
{
    long CommandCount { get; }
    long IncrementCommandCount();
}

public class MyStatistics : IMyStatistics
{
    private long _commandCount;

    public long CommandCount => _commandCount;
    public long IncrementCommandCount()
    {
        return Interlocked.Increment(ref _commandCount);
    }
}

并配置您的选项:

_statistics = new MyStatistics();

optionsBuilder.AddInterceptors(new MyCommandInterceptor(_statistics));

确保 _statistics 是单独的或在正确的范围内创建的。

您可以使用Event Counters

我认为这个工具可以解决问题。