【发布时间】:2021-09-02 20:17:21
【问题描述】:
SQL Server 2016,.NET 4.6.2 上的实体框架 6.4
鉴于这两个表:
- ParentTable (int masterId, int id)
- ChildTable (int id, bit isActive)
ParentTable 和 id 列上的 ChildTable 之间存在一对多关系。
我想计算有多少“活动”子行,masterId 为 1。在 T-SQL 中足够简单
select count(1)
from parentTable
join childTable on parentTable.id = childTable.id
where masterId = 1 and isActive = 0
现在我想在实体框架中这样做。同样,语法很简单:
var activeCount= db.childTable.Count(d => d.parentTable.masterId == 1 && !d.isActive);
然而,两者都返回相同的计数......这个实体框架调用产生了一些非常低效的丑陋 SQL:
exec sp_executesql N'SELECT
[GroupBy1].[A1] AS [C1]
FROM ( SELECT
COUNT(1) AS [A1]
FROM [dbo].[childTable] AS [Extent1]
INNER JOIN [dbo].[parentTable] AS [Extent2] ON [Extent1].[id] = [Extent2].[id]
WHERE ([Extent2].[masterId] = @p__linq__0) AND ([Extent1].[isActive] <> 1)
) AS [GroupBy1]',N'@p__linq__0 int',@p__linq__0=1
区别在于简单的count(1) 语句的逻辑读取次数为 10 次,而实体框架语句的逻辑读取次数为 9200 次。我弄乱了 EF 的不同语法,此时它们都创建了相同的 T-SQL。
我是否在 EF 中遗漏了一些东西来有效地完成这个简单的计数?
【问题讨论】:
标签: sql-server entity-framework-6