Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.