SQL';评论';可以在sql探查器中读取

SQL';评论';可以在sql探查器中读取,sql,entity-framework,linq-to-sql,linq-to-entities,sql-server-profiler,Sql,Entity Framework,Linq To Sql,Linq To Entities,Sql Server Profiler,我已经尝试过几种方法,比如使用双连字符,也就是说,这是一个注释,但是当在探查器中读取执行的sql时,注释被剥离,只留下正在执行的原始sql 我想这样做是为了在查看每分钟超过8000个条目的SQL Profiler输出时能够快速识别查询及其来源, 大概是 --Method signature and an application name e、 g 我正在使用EntityFramework4.3,它使用LINQtoEntities和少量LINQtoSQL使事情更加复杂 编辑:我知道有一些解决方案

我已经尝试过几种方法,比如使用双连字符,也就是说,这是一个注释,但是当在探查器中读取执行的sql时,注释被剥离,只留下正在执行的原始sql

我想这样做是为了在查看每分钟超过8000个条目的SQL Profiler输出时能够快速识别查询及其来源, 大概是

--Method signature and an application name
e、 g

我正在使用EntityFramework4.3,它使用LINQtoEntities和少量LINQtoSQL使事情更加复杂


编辑:我知道有一些解决方案可以添加一个不可靠的where子句或使用匿名属性来识别一些东西,例如,但我希望使用一种更简单的方法或通用的方法。

这里有一种扩展方法,可以用来标记实体框架查询。它使用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("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)
context.Table1.SetQueryName("Search for numbers > 4").Where(x => x.Number > 4)
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)