查询标记Query tags

备注

此为 EF Core 2.2 中的新增功能。

此功能有助于将代码中的 LINQ 查询与日志中捕获的已生成 SQL 查询相关联。 使用新增的 TagWith() 方法对 LINQ 查询进行批注:

  1. var nearestFriends =
  2. (from f in context.Friends.TagWith("This is my spatial query!")
  3. orderby f.Location.Distance(myLocation) descending
  4. select f).Take(5).ToList();

此 LINQ 查询转换为以下 SQL 语句:

  1. -- This is my spatial query!
  2. SELECT TOP(@__p_1) [f].[Name], [f].[Location]
  3. FROM [Friends] AS [f]
  4. ORDER BY [f].[Location].STDistance(@__myLocation_0) DESC

可以对同一个查询多次调用 TagWith()。 查询标记具有累积性。 例如,给定方法如下:

  1. IQueryable<Friend> GetNearestFriends(Point myLocation) =>
  2. from f in context.Friends.TagWith("GetNearestFriends")
  3. orderby f.Location.Distance(myLocation) descending
  4. select f;
  5. IQueryable<T> Limit<T>(IQueryable<T> source, int limit) =>
  6. source.TagWith("Limit").Take(limit);

以下查询:

  1. var results = Limit(GetNearestFriends(myLocation), 25).ToList();

转换为:

  1. -- GetNearestFriends
  2. -- Limit
  3. SELECT TOP(@__p_1) [f].[Name], [f].[Location]
  4. FROM [Friends] AS [f]
  5. ORDER BY [f].[Location].STDistance(@__myLocation_0) DESC

也可以使用多线串作为查询标记。 例如:

  1. var results = Limit(GetNearestFriends(myLocation), 25).TagWith(
  2. @"This is a multi-line
  3. string").ToList();

生成以下 SQL:

  1. -- GetNearestFriends
  2. -- Limit
  3. -- This is a multi-line
  4. -- string
  5. SELECT TOP(@__p_1) [f].[Name], [f].[Location]
  6. FROM [Friends] AS [f]
  7. ORDER BY [f].[Location].STDistance(@__myLocation_0) DESC

已知的限制Known limitations

查询标记不可参数化: EF Core 始终将 LINQ 查询中的查询标记视为,已生成 SQL 中包含的字符串文本。 禁止使用将查询标记用作参数的已编译查询。