gpt4 book ai didi

c# - Entity Framework 6 - 计时查询

转载 作者:可可西里 更新时间:2023-11-01 08:16:10 25 4
gpt4 key购买 nike

我正在使用 Entity Framework 6,它具有出色的数据库拦截器功能,可以记录从应用程序发送到数据库的查询。但是,我正在努力为这些查询计时,我有一个长时间运行的查询,它返回数十万到数百万行,因此它需要大约 6 到 15 秒,具体取决于该查询将返回的数据量。 Entity Framework 正在返回一个 SqlDataReader,因此我无法获得获取结果所需的确切时间。我想知道从发送查询到读取最后一行的完整执行时间。有什么办法可以做到吗。

最佳答案

这是我通常用于 EF 的记录器。

public class EFLoggerForTesting : IDbCommandInterceptor
{
static readonly ConcurrentDictionary<DbCommand, DateTime> m_StartTime = new ConcurrentDictionary<DbCommand, DateTime>();

public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
Log(command, interceptionContext);
}

public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
Log(command, interceptionContext);
}

public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
{
Log(command, interceptionContext);
}

private static void Log<T>(DbCommand command, DbCommandInterceptionContext<T> interceptionContext)
{
DateTime startTime;
TimeSpan duration;


if (m_StartTime.TryRemove(command, out startTime))
{
duration = DateTime.Now - startTime;
}
else
duration = TimeSpan.Zero;

var requestId =-1;
string message;

var parameters = new StringBuilder();
foreach (DbParameter param in command.Parameters)
{
parameters.AppendLine(param.ParameterName + " " + param.DbType + " = " + param.Value);
}

if (interceptionContext.Exception == null)
{
message = string.Format("Database call took {0} sec. RequestId {1} \r\nCommand:\r\n{2}", duration.TotalSeconds.ToString("N3"), requestId, parameters.ToString() + command.CommandText);
}
else
{
message = string.Format("EF Database call failed after {0} sec. RequestId {1} \r\nCommand:\r\n{2}\r\nError:{3} ", duration.TotalSeconds.ToString("N3"), requestId, parameters.ToString() + command.CommandText, interceptionContext.Exception);
}

Debug.WriteLine(message);
}


public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
OnStart(command);
}

public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
OnStart(command);
}

public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
{
OnStart(command);
}
private static void OnStart(DbCommand command)
{
m_StartTime.TryAdd(command, DateTime.Now);
}
}

不幸的是,文档不存在,所以我不知道这是否适用于您的场景。

关于c# - Entity Framework 6 - 计时查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27196944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com