クエリ タグは、コード内の 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 に含まれる文字列リテラルとして常に扱います。 パラメーターとしてクエリ タグを受け取るコンパイル済みクエリは許可されません。
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET