我正在测试下面的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? p>
答案 0 :(得分:3)
所有这些MigrationHistory
相关查询只运行一次,这是您的代码第一次连接到数据库。 EF只是尝试验证数据库是否需要升级到更新的版本。
要确认这一点,请尝试使用之前之前的任何有意义的查询,以便Include
的查询是第二个查询。您将看到所有这些版本噪声,然后是您的第一个查询,然后没有,因为Include
本身没有检索任何内容。