我使用EF通過SELECT語句獲取記錄。對於某些性能問題,我需要記錄命令,以便返回的行數例如爲1000.但我找不到任何示例或文檔來執行此操作。如何記錄EF選擇命令中的記錄數
我想可以使用IDbCommandInterceptor並實現CommandExecuted方法來實現。但不確定。
IDbCommandInterceptor是可用的還是應該以另一種方式做到這一點?
我使用EF通過SELECT語句獲取記錄。對於某些性能問題,我需要記錄命令,以便返回的行數例如爲1000.但我找不到任何示例或文檔來執行此操作。如何記錄EF選擇命令中的記錄數
我想可以使用IDbCommandInterceptor並實現CommandExecuted方法來實現。但不確定。
IDbCommandInterceptor是可用的還是應該以另一種方式做到這一點?
搜索網頁和調試&跟蹤&調查EF來源,我意識到,通過目前的實現是不可能的後。 IDbCommandInterceptor.CommandExecuted Interceptor在數據庫上查詢後立即調用,只有我們有DbDataReader,command,...但沒有獲取記錄數。 獲取提取記錄計數枚舉對DbDataReader應該做到可以得到行計數。所以我更改了EF LazyEnumerator,並且在每次調用MoveNext之後,增加本地變量,並且在處置LazyEnumerator時,我們獲取了行號或物化實體編號
您可以使用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)
{
}
}
此日誌僅顯示commandtext,..但未提取行號。 –
謝謝。但在哪裏以及如何獲取行號。 –
你能顯示你的查詢嗎? – Sampath