2016-09-08 2 views
2

Я использую EF для получения записей по инструкции SELECT. для некоторой проблемы с производительностью I, m необходимо записать команды, чтобы возвращаемое количество строк выдавало, например, 1000. Но я не могу найти никаких примеров или документации для этого.Как записать количество записей в EF Выберите команду

Я думаю, можно использовать IDbCommandInterceptor и реализовать метод CommandExecuted для достижения этого. но не уверен.

Являются ли IDbCommandInterceptor пригодными для использования или должны делать это по-другому?

ответ

0

после поиска Web и отладки & трассировки & Исследовать EF Источник Я понял, что это невозможно по текущей реализации , IDbCommandInterceptor.CommandExecuted Interceptor, вызванный сразу после запроса в базе данных, только у нас есть DbDataReader, команда, ... но не выборка количества записей. , чтобы получить выборку счетчика записей с DbDataReader, чтобы сделать счетчик строк. поэтому я изменил EF LazyEnumerator и после каждого вызова MoveNext увеличил локальную переменную, а при утилизации LazyEnumerator мы получили номер строки или материализованный номер объекта

0

Вы можете использовать Context Log property, как показано ниже.

Примечание: Это всего лишь пример. Измените его, как хотите.

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 вызывает LogParameter для каждого параметра ; вы можете сделать то же самое в своих переопределениях или обрабатывать параметры иначе.

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) 
    { 
    } 
} 

Ссылка:Logging and Intercepting Database Operations

+0

этот журнал показывает только командный текст, но не выбранный номер строки. –

+0

спасибо. но где & как я могу получить номер строки. –

+0

Вы можете показать свой запрос? – Sampath

Смежные вопросы