c# - .Include 方法是否命中 LINQ 中的数据库?

标签 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') 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/

相关文章:

c# - 如何使用 Excel-DNA 创建新工作表并用数据行填充它?

c# - Xamarin iOS 在 UIWebView 中加载内容

c# - Azure Devops - 通过代理池 ID 获取发布定义

sql - 如何更新来自另一个表的 TOP 1 的列

c# - 针对慢速分组的 LINQ 查询优化

c# - 为什么 Entity Framework 有 AddAsync?

c# - 使用 iTextSharp 读取 PDF 文件附件注释

c# - 从两个不同的文本框 ASP.NET C# 将两个数据插入同一列

mysql - ALTER TABLE 语句与 FOREIGN KEY 约束 sql 冲突

c# - Entity Framework 不加载相关对象