2016-08-20 3 views
2

以下の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()への呼び出しを取り除いても、データベースにヒットします。だから今私は思っている、それはデータベースを強制的にヒット?

+0

Count()呼び出しを行わないと、データベースにヒットしないでください。インクルードはクエリの実行を強制することはできませんが、クエリの作成自体にとって不可欠です。他に何かがあったに違いありません。 Include()呼び出しの後でコンテキストを破棄し、例外がスローされた場所(クエリが実行される場所)を確認してみることができます – DevilSuichiro

答えて

2

これらのMigrationHistoryはすべて、コードがデータベースに初めて接続されたときに一度だけ実行されます。 EFは、データベースを新しいバージョンにアップグレードする必要があるかどうかを確認するだけです。

これを確認するには、の前にの意味のあるクエリを試して、Includeのクエリが2番目のクエリになるようにしてください。 Include自体は何も取得していないので、このすべてのバージョンのノイズ、最初のクエリ、そして何も表示されません。

+0

OK、部分的ですが部分的です。 'Products'に問い合わせる最後のものはどうですか?それはなぜ起こるのですか? –

+1

あなたはProduct COnt(1)FROM Productsを実行する 'productEntities.Count()'を実行しているためです。 – Maarten

関連する問題