Udostępnij za pośrednictwem


Tagi zapytań

Tagi zapytań pomagają skorelować zapytania LINQ w kodzie z wygenerowanymi zapytaniami SQL przechwyconymi w dziennikach. Adnotujesz zapytanie LINQ, używając nowej metody TagWith().

Wskazówka

Przykład z tego artykułu można zobaczyć w witrynie GitHub.

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

To zapytanie LINQ jest tłumaczone na następującą instrukcję 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

Można wywołać TagWith() wiele razy w tym samym zapytaniu. Tagi zapytań są skumulowane. Na przykład, biorąc pod uwagę następujące metody:

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);

Następujące zapytanie:

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

Przekłada się na:

-- GetNearestPeople

-- Limit

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

Można również używać ciągów wielowierszowych jako tagów zapytań. Przykład:

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

Tworzy następujący kod 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

Znane ograniczenia

Tagi zapytań nie są sparametryzowalne: Program EF Core zawsze traktuje tagi zapytań w zapytaniu LINQ jako literały tekstowe, które są zawarte w wygenerowanym języku SQL. Skompilowane zapytania, które przyjmują tagi zapytania jako parametry, nie są dozwolone.