【发布时间】:2019-06-20 00:42:23
【问题描述】:
编辑:在 ProductAttributes 上删除了其他包含仍然相同的结果表大小 50k 行
我得到了这段代码,与我的 T-SQL 语句相比,它的运行速度太慢了。
return _context.ProductAttributes
.Include(e => e.ProductProductAttributes)
.Select(x => new GetProductAttributesModel
{
Attribute = x,
Count = x.ProductProductAttributes.Count()
})
.ToArrayAsync();
这是用于比较的 T-SQL 语句:
SELECT *
FROM Product_Attribute a
LEFT JOIN
(SELECT COUNT(*) AS ctn, AttributeId
FROM Product_ProductAttribute
GROUP BY AttributeId) d ON d.AttributeId = a.Id
如何获得更快或至少类似于 T-SQL 语句的 Entity Framework Core 实现?
我希望我不需要为此在选择中执行存储过程...看起来很简单
【问题讨论】:
-
查询计划显示/建议什么?可能根本与 LINQ/EF 无关。至少我看不出有什么问题。
-
Entity Framework 旨在提高程序员的生产力 - 它从来没有被设计成比原始 SQL 更快(而且它不可能 - 毕竟,它比简单的 T-SQL 语句做的工作要多得多)。
-
你的 EF 代码总是比纯 sql 慢。这是预期的行为
-
这两个查询完全不同。您的 SQL 版本中甚至没有使用“Relatives”表...
-
您不需要任何 Inculde() 调用 - 没有它,您的查询可以在 SQL 端进行评估。