我正在测试下面的 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') 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() 的调用,它仍然会访问数据库。所以现在我在想,是 .Include 强制命中数据库吗?
最佳答案
所有这些与 MigrationHistory
相关的查询只运行一次,即您的代码第一次连接到数据库时。 EF 只是尝试验证数据库是否需要升级到更新的版本。
要确认这一点,请在您提供的查询之前尝试任何有意义的查询,以便带有Include
的查询是第二个查询。您会看到所有这些版本控制噪音,然后是您的第一个查询,然后什么也没有,因为 Include
本身没有检索任何内容。
关于c# - .Include 方法是否命中 LINQ 中的数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39058015/