Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何在EF Select命令中记录记录数_Entity Framework_Entity Framework 6 - Fatal编程技术网

Entity framework 如何在EF Select命令中记录记录数

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())

我使用EF通过SELECT语句获取记录。对于某些性能问题,我需要记录命令,以便返回的行数超过1000行。但我找不到任何这样做的例子或文档

我认为可以使用IDbCommandInterceptor并实现CommandExecuted方法来实现这一点。但不确定


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可以收集这些信息。