クエリのタグQuery tags

注意

これは EF Core 2.2 の新機能です。This feature is new in EF Core 2.2.

この機能は、コード内の LINQ クエリを、ログでキャプチャされる生成済みの SQL クエリと関連付けるのに役立ちます。This feature helps correlate LINQ queries in code with generated SQL queries captured in logs. 新しい TagWith() メソッドを使用して LINQ クエリに注釈を付けます。You annotate a LINQ query using the new TagWith() method:

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

この LINQ クエリは、次の SQL ステートメントに変換されます。This LINQ query is translated to the following SQL statement:

-- This is my spatial query!

SELECT TOP(@__p_1) [f].[Name], [f].[Location]
FROM [Friends] AS [f]
ORDER BY [f].[Location].STDistance(@__myLocation_0) DESC

同じクエリに対して何度も TagWith() を呼び出すことが可能です。It's possible to call TagWith() many times on the same query. クエリのタグは累積されます。Query tags are cumulative. たとえば、次のようなメソッドがあるとします。For example, given the following methods:

IQueryable<Friend> GetNearestFriends(Point myLocation) =>
    from f in context.Friends.TagWith("GetNearestFriends")
    orderby f.Location.Distance(myLocation) descending
    select f;

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

次のクエリ:The following query:

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

これは次のように変換されます。Translates to:

-- GetNearestFriends

-- Limit

SELECT TOP(@__p_1) [f].[Name], [f].[Location]
FROM [Friends] AS [f]
ORDER BY [f].[Location].STDistance(@__myLocation_0) DESC

クエリのタグとして複数行の文字列を使用することも可能です。It's also possible to use multi-line strings as query tags. 次に例を示します。For example:

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

これは次の SQL を生成します。Produces the following SQL:

-- GetNearestFriends

-- Limit

-- This is a multi-line
-- string

SELECT TOP(@__p_1) [f].[Name], [f].[Location]
FROM [Friends] AS [f]
ORDER BY [f].[Location].STDistance(@__myLocation_0) DESC

既知の制限事項Known limitations

クエリのタグはパラ―メーター化できません: EF Core では、LINQ クエリ内のクエリのタグが常に、生成される SQL に含まれる文字列リテラルとして扱われます。Query tags aren't parameterizable: EF Core always treats query tags in the LINQ query as string literals that are included in the generated SQL. コンパイルされたクエリがパラメーターとしてクエリのタグを受け取ることはできません。Compiled queries that take query tags as parameters aren't allowed.