抱歉,如果这太明显了,我想知道下面的两个代码块在性能和检索的数据量方面是否存在差异?
将在查询末尾指定 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/