2

我已經嘗試了幾種方法,例如使用雙連字符,即 - 這是一個註釋,但是當在分析器中讀取已執行的sql時,註釋被剝離只有正在執行的原始SQL。可以在sql分析器中讀取的SQL'comment'

我想這樣做是爲了使查詢和他們的起源的快速識別看着SQL探查器輸出具有每分鐘超過8000個條目, 所以像

--Method signature and an application name 

例如,當

--MyMethod(string username) in MyFunkyAppName. 
我使用的EntityFramework 4.3與LINQ到實體和LINQ一知半解甚至更加複雜的事情

到SQL拋出的良好措施。

編輯:我知道的解決方案添加一個狡猾的where子句或使用匿名屬性來確定的東西,如Clever tricks to find specific LINQ queries in SQL Profiler但我希望一個遠不如哈克方法或者一個普通的一個。

回答

2

下面是一個擴展方法,您可以使用它來標記實體框架查詢。它使用WHERE子句,但不應損害性能。

public static class ExtensionMethods 
{ 
    public static IQueryable<T> SetQueryName<T>(this IQueryable<T> source, 
    [CallerMemberName] String name = null, 
    [CallerFilePath] String sourceFilePath = "", 
    [CallerLineNumber] Int32 sourceLineNumber = 0) 
    { 
    var expr = Expression.NotEqual(Expression.Constant("Query name: " + name), Expression.Constant(null)); 
    var param = Expression.Parameter(typeof(T), "param"); 
    var criteria1 = Expression.Lambda<Func<T, Boolean>>(expr, param); 

    expr = Expression.NotEqual(Expression.Constant($"Source: {sourceFilePath} ({sourceLineNumber})"), Expression.Constant(null)); 
    var criteria2 = Expression.Lambda<Func<T, Boolean>>(expr, param); 

    return source.Where(criteria1).Where(criteria2); 
    } 
} 

這裏是如何使用它:

context.Table1.SetQueryName().Where(x => x.C1 > 4) 

它將使用調用方法的名稱作爲查詢名稱。

您可以指定另一個名字是這樣的:

context.Table1.SetQueryName("Search for numbers > 4").Where(x => x.Number > 4) 

下面是SQL怎麼會是這樣的:

SELECT 
    [Extent1].[Number] AS [Number] 
    FROM (SELECT 
    [Table1].[Number] AS [Number] 
    FROM [dbo].[Table1] AS [Table1]) AS [Extent1] 
    WHERE 
     (N'Query name: Search for numbers > 4' IS NOT NULL) 
     AND 
     (N'Source: C:\Code\Projects\MyApp\Program.cs (49)' IS NOT NULL) 
     AND ([Extent1].[Number] > 4)