c# - 在查询开始和结束时调用 'where' 函数在性能上有区别吗?

标签 c# asp.net-core entity-framework-core

抱歉,如果这太明显了,我想知道下面的两个代码块在性能和检索的数据量方面是否存在差异? 将在查询末尾指定 id(如 FirstOrDefaultAsync(b => b.BuyModelId == modelId))首先获取所有表数据,然后根据 id 对其进行评估?

并且将在开始时调用 Where 函数(像这样 Where(b => b.BuyModelId == modelId))将根据 id 和然后调用包含函数?

总结一下我的问题:这些语句的执行是否有特定的顺序?

因为我担心在调用数据库时可能会有一些额外的开销。

public async Task<BuyModel> GetModelById(int modelId)
{
    return await _applicationDbContext.BuyModels
         .Where(b => b.BuyModelId == modelId)
         .Include(b => b.Buyer)
         .Include(b => b.ItemsToBuy).ThenInclude(p => p.Category)
         .Include(b => b.ItemsToBuy).ThenInclude(p => p.SalesUser).FirstOrDefaultAsync();
}
public async Task<BuyModel> GetModelById(int modelId)
{
    return await _applicationDbContext.BuyModels
         .Include(b => b.Buyer)
         .Include(b => b.ItemsToBuy).ThenInclude(p => p.Category)
         .Include(b => b.ItemsToBuy).ThenInclude(p => p.SalesUser).FirstOrDefaultAsync(b => b.BuyModelId == modelId);
}

最佳答案

如评论中所述,LINQ-to-entities 查询的性能分为两层。

首先是生成什么SQL。在你的场景中,我猜他们会是一样的。唯一可以确定的方法是让 EF 输出生成的 SQL。

如果生成的 SQL 不同,那么 SQL 仍然可以创建相同的执行计划。在优化查询方面,SQL Server 有很多智慧和魔力。两个查询很有可能会产生相同的执行计划,从而产生相同的性能。

但如果您真的关心性能,您应该真正分析生成的 SQL 查询以及 SQL 如何运行该查询。最好是完整的和启用索引的,这样执行计划才切合实际。

关于c# - 在查询开始和结束时调用 'where' 函数在性能上有区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58062054/

相关文章:

c# - 构建一个 C# 应用程序,使其根据运行的云使用 s3 或 blob

c# - 如何在 C# 中修复 SQLite 查询?

.net - 使用任务计划程序在Windows上计划.Net Core控制台应用程序

asp.net-core - 在 ASP.NET Core 中使用 Entity Framework Core 从 SQL Server 数据库启动应用程序期间加载应用程序范围的设置

c# - 如何在 System.Net.WebSockets 中的 ClientWebSocket 上设置 ClientWebSocketOptions

c# - 列宽的数据注释

c# - 基础连接已关闭。无法使用 HTTP.sys 运行 Asp.Net Core 2.1 Web API 应用程序?

c# - Url.RouteUrl 在 ASP.NET Core 3.0 中为空

c# - 英孚核心 2.1。如何还原迁移 "n"后退一步

c# - Entity Framework Core 2.1 中的多级模型类