Pau*_*hra 3 sql linq-to-entities entity-framework sql-server-profiler linq-to-sql
我尝试了几种方法,例如使用双连字符,即--THIS IS A COMMENT,但是当在探查器中读取已执行的sql时,注释将被剥离,仅留下正在执行的原始SQL。
我想这样做是为了在查看每分钟有8000多个条目的SQL事件探查器输出时快速识别查询及其来源。
--Method signature and an application name
Run Code Online (Sandbox Code Playgroud)
例如
--MyMethod(string username) in MyFunkyAppName.
Run Code Online (Sandbox Code Playgroud)
我正在使用EntityFramework 4.3,它使linq到实体变得更加复杂,而linq到sql的少量散布则带来了很好的效果。
编辑:我知道添加一个狡猾的where子句或使用匿名属性来识别事物的解决方案,例如在SQL Profiler中找到巧妙的LINQ查询的聪明技巧,但我希望可以使用一种更简单的方法,也可以是一种通用的方法。
这是您可以用来标记实体框架查询的扩展方法。它使用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);
}
}
Run Code Online (Sandbox Code Playgroud)
使用方法如下:
context.Table1.SetQueryName().Where(x => x.C1 > 4)
Run Code Online (Sandbox Code Playgroud)
它将使用调用方法名称作为查询名称。
您可以指定其他名称,如下所示:
context.Table1.SetQueryName("Search for numbers > 4").Where(x => x.Number > 4)
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)