2016-09-08 50 views
2

我使用EF通過SELECT語句獲取記錄。對於某些性能問題,我需要記錄命令,以便返回的行數例如爲1000.但我找不到任何示例或文檔來執行此操作。如何記錄EF選擇命令中的記錄數

我想可以使用IDbCommandInterceptor並實現CommandExecuted方法來實現。但不確定。

IDbCommandInterceptor是可用的還是應該以另一種方式做到這一點?

回答

0

搜索網頁和調試&跟蹤&調查EF來源,我意識到,通過目前的實現是不可能的後。 IDbCommandInterceptor.CommandExecuted Interceptor在數據庫上查詢後立即調用,只有我們有DbDataReader,command,...但沒有獲取記錄數。 獲取提取記錄計數枚舉對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

此日誌僅顯示commandtext,..但未提取行號。 –

+0

謝謝。但在哪裏以及如何獲取行號。 –

+0

你能顯示你的查詢嗎? – Sampath