自分で調べてテストする 1 つの方法:
SQL Server Management Studio を開き、新しいクエリを開き、EF を実行するデータベースを選択して、次のクエリを実行します。
SELECT top 10 deqs.last_execution_time AS [Time], dest.TEXT AS [Query]
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
ORDER BY deqs.last_execution_time DESC
これにより、データベースに対して実行された過去 10 件のクエリが表示されます。
TestWhenSqlFires() の最初の行にブレークポイントを設定し、コードを実行してから、各行をステップ オーバーした後に上記のクエリを実行します。あなたは見つけるでしょう:
// C# Line 1
var db = new Db();
--SQL Line 1
SELECT TABLE_SCHEMA SchemaName, TABLE_NAME Name FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
// C# Line 2
var items = db.SimpleObjects;
--SQL Line 2
SELECT COUNT(*) FROM [sys].[databases] WHERE [name]=@1
SELECT [GroupBy1].[A1] AS [C1] FROM (
SELECT COUNT(1) AS [A1] FROM [dbo].[__MigrationHistory] AS [Extent1]
) AS [GroupBy1]
(@1 nvarchar(4000))SELECT TOP (1) [Project1].[C1] AS [C1],
[Project1].[MigrationId] AS [MigrationId],
[Project1].[Model] AS [Model] FROM (
SELECT [Extent1].[MigrationId] AS [MigrationId],
[Extent1].[Model] AS [Model], 1 AS [C1]
FROM [dbo].[__MigrationHistory] AS [Extent1]
) AS [Project1] ORDER BY [Project1].[MigrationId] DESC
// C# Line 3
var byId = WhereId(items, 1);
--SQL Line 3
// C# Line 4
var array = byId.ToArray();
--SQL Line 4
SELECT [Extent1].[Id] AS [Id], [Extent1].[Stuff] AS [Stuff]
FROM [dbo].[SimpleObject] AS [Extent1]
最後の SQL クエリは、実際にデータをフェッチする EF です。前のクエリはウォームアップにすぎません。データベースが存在すること、EF5 移行履歴を使用していること、現在の移行履歴ハッシュと一致していることを確認します。
答えは -.ToArray()
が呼び出された後の 4 行目 (または、.ToList()、foreach などのコレクションを列挙する任意の呼び出し) です。特に、IEnumerable を受け入れるメソッドに渡すと、特定の Generic が関係していても、コレクションが列挙されないため、必要以上に早く SQL が開始されません。