2

Я пробовал несколько методов, например, используя двойные дефисы, т. Е. --THIS - это КОММЕНТАРИЙ, но когда исполняемый sql считывается в профилировщике, комментарий удаляется только сырой SQL, который выполняется.SQL 'comment', который может быть прочитан в профиле sql

Я хочу сделать это для того, чтобы быстро идентифицировать запросы и их происхождение при взгляде на выходе SQL профайлеры, который имеет более 8000 записей в минуту, так что-то вроде

--Method signature and an application name 

например

--MyMethod(string username) in MyFunkyAppName. 

Я использую EntityFramework 4.3, которая усложняет вещи еще с LINQ к лицам и поверхностное знание LINQ к SQL, добавленными для хорошей мерой.

EDIT: Я в курсе решений добавить изворотливый, где пункт или использовать анонимные свойства, чтобы идентифицировать вещи, такие как Clever tricks to find specific LINQ queries in SQL Profiler, но я надеюсь на гораздо менее Hacky подход или, возможно, один общий.

ответ

2

Это метод расширения, который вы можете использовать для пометки запросов Entity Framework. Он использует предложение 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) 

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

  • Нет связанных вопросов^_^