次の方法で共有


クエリのタグ

クエリ タグは、コード内の LINQ クエリと、ログにキャプチャされた生成された SQL クエリを関連付けるのに役立ちます。 新しい TagWith() メソッドを使用して LINQ クエリに注釈を付けます。

ヒント

この記事の サンプル は、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();

この 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 = await Limit(GetNearestPeople(context, new Point(1, 2)), 25).ToListAsync();

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

-- GetNearestPeople

-- Limit

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

クエリ タグとして複数行の文字列を使用することもできます。 例えば次が挙げられます。

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

次の 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 に含まれる文字列リテラルとして常に扱います。 パラメーターとしてクエリ タグを受け取るコンパイル済みクエリは許可されません。