Теги запросов

Теги запросов помогают сопоставить запросы LINQ в коде со сгенерированными запросами SQL, зарегистрированными в журналах. Мы можете пометить запрос LINQ с помощью нового метода TagWith():

Совет

Для этой статьи вы можете скачать пример из репозитория GitHub.

var myLocation = new Point(1, 2);
var nearestPeople = (from f in context.People.TagWith("This is my spatial query!")
                     orderby f.Location.Distance(myLocation) descending
                     select f).Take(5).ToList();

Этот запрос LINQ преобразуется в следующую инструкцию SQL:

-- This is my spatial query!

SELECT TOP(@__p_1) [p].[Id], [p].[Location]
FROM [People] AS [p]
ORDER BY [p].[Location].STDistance(@__myLocation_0) DESC

Метод TagWith() можно вызвать много раз для одного и того же запроса. Теги запросов являются кумулятивными. Например, при использовании следующих методов

private static IQueryable<Person> GetNearestPeople(SpatialContext context, Point myLocation)
    => from f in context.People.TagWith("GetNearestPeople")
       orderby f.Location.Distance(myLocation) descending
       select f;

private static IQueryable<T> Limit<T>(IQueryable<T> source, int limit) => source.TagWith("Limit").Take(limit);

этот запрос

var results = Limit(GetNearestPeople(context, new Point(1, 2)), 25).ToList();

преобразуется в:

-- GetNearestPeople

-- Limit

SELECT TOP(@__p_1) [p].[Id], [p].[Location]
FROM [People] AS [p]
ORDER BY [p].[Location].STDistance(@__myLocation_0) DESC

В качестве тегов запросов можно использовать многострочные литералы. Пример:

                var results = Limit(GetNearestPeople(context, new Point(1, 2)), 25).TagWith(
                    @"This is a multi-line
string").ToList();

Преобразуется в следующий запрос SQL:

-- GetNearestPeople

-- Limit

-- This is a multi-line
-- string

SELECT TOP(@__p_1) [p].[Id], [p].[Location]
FROM [People] AS [p]
ORDER BY [p].[Location].STDistance(@__myLocation_0) DESC

Известные ограничения

Теги запросов не поддерживают параметризацию — EF Core всегда обрабатывает теги в запросе LINQ как строковые литералы, которые включаются в сгенерированный запрос SQL. Скомпилированные запросы, принимающие теги запросов в качестве параметров, не допускаются.