以下のLinqクエリをテストしています。そして、私は、データベースのヒットがあるかどうかを確認するためにログをチェックしています:.IncludeメソッドはLINQのデータベースにヒットしますか?
var productEntities = _context.Set<Product>()
.Include(p => p.OrderItems)
.Include(p => p.OrderItems.Select(oi => oi.Order))
.Include(p => p.OrderItems.Select(oi => oi.Order.Client));
Console.WriteLine(productEntities.Count());
私は(カウントの呼び出しをコメントアウト)かどうかは、ログにはこれと同じ出力を示しています。
Opened connection at 8/20/2016 3:32:53 PM -04:00
SELECT Count(*) FROM INFORMATION_SCHEMA.TABLES AS t WHERE t.TABLE_SCHEMA + '.' + t.TABLE_NAME IN ('dbo.AccountRecords','dbo.Products','dbo.Doughs','dbo.OrderItems','dbo.Orders','dbo.Clients','dbo.ShippingInformations','dbo.OrderSpecialClients','dbo.OrderSpecialProducts','dbo.Taxes','dbo.FixedOrders','dbo.FixedOrderItems','dbo.OrderSubstitutions','dbo.OrderPerformanceLog') OR t.TABLE_NAME = 'EdmMetadata' -- Executing at 8/20/2016 3:32:53 PM -04:00 -- Completed in 2 ms with result: 14
Closed connection at 8/20/2016 3:32:53 PM -04:00 Opened connection at 8/20/2016 3:32:53 PM -04:00 SELECT [GroupBy1].[A1] AS [C1] FROM (SELECT COUNT(1) AS [A1] FROM [dbo].[__MigrationHistory] AS [Extent1] WHERE [Extent1].[ContextKey] = @p__linq__0 ) AS [GroupBy1] -- p__linq__0: 'Arhoma.Core.Data.ArhomaContext' (Type = String, Size = 4000) -- Executing at 8/20/2016 3:32:53 PM -04:00 -- Failed in 51 ms with error: Invalid object name 'dbo.__MigrationHistory'.
Closed connection at 8/20/2016 3:32:53 PM -04:00 Opened connection at 8/20/2016 3:32:53 PM -04:00 SELECT [GroupBy1].[A1] AS [C1] FROM (SELECT COUNT(1) AS [A1] FROM [dbo].[__MigrationHistory] AS [Extent1] ) AS [GroupBy1] -- Executing at 8/20/2016 3:32:53 PM -04:00 -- Failed in 36 ms with error: Invalid object name 'dbo.__MigrationHistory'.
Closed connection at 8/20/2016 3:32:53 PM -04:00 Opened connection at 8/20/2016 3:32:53 PM -04:00 SELECT [GroupBy1].[A1] AS [C1] FROM (SELECT COUNT(1) AS [A1] FROM [dbo].[Products] AS [Extent1] ) AS [GroupBy1] -- Executing at 8/20/2016 3:32:53 PM -04:00 -- Completed in 0 ms with result: SqlDataReader
Closed connection at 8/20/2016 3:32:53 PM -04:00 299
私の質問:なぜデータベースにヒットしたのですか? .ToList()や何かを追加するときや、.Count()を呼び出すときにヒットしたと思いますか?しかし、Count()への呼び出しを取り除いても、データベースにヒットします。だから今私は思っている、それはデータベースを強制的にヒット?
Count()呼び出しを行わないと、データベースにヒットしないでください。インクルードはクエリの実行を強制することはできませんが、クエリの作成自体にとって不可欠です。他に何かがあったに違いありません。 Include()呼び出しの後でコンテキストを破棄し、例外がスローされた場所(クエリが実行される場所)を確認してみることができます – DevilSuichiro