Entity framework 如何在EF Select命令中记录记录数
我使用EF通过SELECT语句获取记录。对于某些性能问题,我需要记录命令,以便返回的行数超过1000行。但我找不到任何这样做的例子或文档 我认为可以使用IDbCommandInterceptor并实现CommandExecuted方法来实现这一点。但不确定Entity framework 如何在EF Select命令中记录记录数,entity-framework,entity-framework-6,Entity Framework,Entity Framework 6,我使用EF通过SELECT语句获取记录。对于某些性能问题,我需要记录命令,以便返回的行数超过1000行。但我找不到任何这样做的例子或文档 我认为可以使用IDbCommandInterceptor并实现CommandExecuted方法来实现这一点。但不确定 IDbCommandInterceptor是可用的还是应该以另一种方式执行?您可以使用上下文日志属性,如下所示 注意:这只是一个例子。你想怎么改就怎么改 using (var context = new BlogContext())
IDbCommandInterceptor是可用的还是应该以另一种方式执行?您可以使用
上下文日志属性,如下所示
注意:这只是一个例子。你想怎么改就怎么改
using (var context = new BlogContext())
{
context.Database.Log = Console.Write;
var blog = context.Blogs.First(b => b.Title == "One Unicorn");
}
以上将生成以下输出:
SELECT TOP (1)
[Extent1].[Id] AS [Id],
[Extent1].[Title] AS [Title]
FROM [dbo].[Blogs] AS [Extent1]
WHERE (N'One Unicorn' = [Extent1].[Title]) AND ([Extent1].[Title] IS NOT NULL)
-- Executing at 10/8/2013 10:55:41 AM -07:00
-- Completed in 4 ms with result: SqlDataReader
如果需要,您可以自定义DatabaseLogFormatter
您可以覆盖以下提到的方法:
LogCommand–覆盖此选项以更改之前记录命令的方式
他们被处决了。默认情况下,LogCommand为每个
参数您可以选择在覆盖或句柄中执行相同的操作
相反,参数是不同的
LogResult–覆盖此选项以更改执行
命令已被记录
LogParameter–覆盖此选项以更改的格式和内容
参数记录
下面是一个如何做到这一点的示例:
public class OneLineFormatter : DatabaseLogFormatter
{
public OneLineFormatter(DbContext context, Action<string> writeAction)
: base(context, writeAction)
{
}
public override void LogCommand<TResult>(
DbCommand command, DbCommandInterceptionContext<TResult> interceptionContext)
{
Write(string.Format(
"Context '{0}' is executing command '{1}'{2}",
Context.GetType().Name,
command.CommandText.Replace(Environment.NewLine, ""),
Environment.NewLine));
}
public override void LogResult<TResult>(
DbCommand command, DbCommandInterceptionContext<TResult> interceptionContext)
{
}
}
公共类OneLineFormatter:DatabaseLogFormatter
{
公共OneLineFormatter(DbContext上下文、操作writeAction)
:base(上下文、写操作)
{
}
公共覆盖无效日志命令(
DbCommand命令,dbcommandinterceptoncontext interceptoncontext)
{
写入(字符串格式(
“上下文{0}正在执行命令{1}{2}”,
Context.GetType().Name,
command.CommandText.Replace(Environment.NewLine,“”),
环境(新线),;
}
公共覆盖无效日志结果(
DbCommand命令,dbcommandinterceptoncontext interceptoncontext)
{
}
}
参考:在搜索Web并调试、跟踪和调查EF源代码后,我意识到当前的实现不可能做到这一点。IDbCommandInterceptor.CommandExecuted Interceptor在数据库查询之后调用,只有DbDataReader、command、。。。但不获取记录计数。
要获取获取的记录计数,应对DbDataReader进行枚举以获取行计数。因此,我更改了EF LazyEnumerator,每次调用MoveNext后,递增局部变量,在处理LazyEnumerator时,我们获取了行号或实体号此日志仅显示commandtext。。但是没有拿到行号。谢谢。但是在哪里以及如何获取行号。您是否已整理您的问题或什么?是的,我已整理问题,但我更改了EntityFramework源并使用该版本,即EntityFramework的官方版本;我想这不是不可能的,因为EFProf可以收集这些信息。