.Include方法是否在LINQ中命中了数据库?

时间:2016-08-20 19:36:57

标签: c# sql-server entity-framework linq

我正在测试下面的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());

我是否注释掉对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')       或者t.TABLE_NAME ='EdmMetadata'    - 执行时间为2016年8月20日下午3:32:53 - 04:00    - 在2毫秒内完成,结果:14

     

2016年8月20日3:32:53关闭连接-04:00打开连接   8/20/2016 3:32:53 PM -04:00 SELECT       [GroupBy1]。[A1] AS [C1]       FROM(选择           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)    - 执行时间为2016年8月20日下午3:32:53 - 04:00    - 51 ms失败,错误:无效的对象名称'dbo .__ MigrationHistory'。

     

2016年8月20日3:32:53关闭连接-04:00打开连接   8/20/2016 3:32:53 PM -04:00 SELECT       [GroupBy1]。[A1] AS [C1]       FROM(选择           COUNT(1)AS [A1]           FROM [dbo]。[__ MigrationHistory] ​​AS [Extent1]       )AS [GroupBy1]    - 执行时间为2016年8月20日下午3:32:53 - 04:00    - 36 ms失败并出现错误:无效的对象名称'dbo .__ MigrationHistory'。

     

2016年8月20日3:32:53关闭连接-04:00打开连接   8/20/2016 3:32:53 PM -04:00 SELECT       [GroupBy1]。[A1] AS [C1]       FROM(选择           COUNT(1)AS [A1]           FROM [dbo]。[产品] AS [Extent1]       )AS [GroupBy1]    - 执行时间为2016年8月20日下午3:32:53 - 04:00    - 在0 ms内完成,结果为:SqlDataReader

     

2016年8月20日下午3:32:53关闭连接-04:00 299

我的问题:为什么它会袭击数据库?我认为当我添加.ToList()或者什么或者它调用.Count()时会发生命中?但即使我删除了对Count()的调用,它仍然会访问数据库。所以现在我在想,是不是强制数据库命中的.Include?

1 个答案:

答案 0 :(得分:3)

所有这些MigrationHistory相关查询只运行一次,这是您的代码第一次连接到数据库。 EF只是尝试验证数据库是否需要升级到更新的版本。

要确认这一点,请尝试使用之前之前的任何有意义的查询,以便Include的查询是第二个查询。您将看到所有这些版本噪声,然后是您的第一个查询,然后没有,因为Include本身没有检索任何内容。