实体框架优化计数子实体

时间:2016-07-19 11:18:46

标签: c# entity-framework linq-to-sql

我正在尝试优化使用Entity Framework Linq生成的查询到SQL查询。下面是我的查询的大规模简化版本。

C#

List<bool> isUsed = Context.tParent.Select(parent => 
    parent.tChild.Any()
).ToList();

这会生成以下SQL

生成SQL

SELECT 
    CASE WHEN (( EXISTS (SELECT 
        1 AS [C1]
        FROM [dbo].[tChild] AS [Extent2]
        WHERE [Extent1].[Id] = [Extent2].[ParentId]
    ))
    ) THEN cast(1 as bit) ELSE cast(0 as bit) END AS [C1]
    FROM [dbo].[tParent] AS [Extent1]

不幸的是,这表现不佳(我的真实查询会检查许多链接表上的计数),如果我按如下方式重写查询,速度会大大提高。

优化查询

SELECT CASE WHEN (
    COUNT(tChild.Id) > 0
) THEN 1 ELSE 0 END
FROM tParent
    LEFT JOIN tChild ON tParent.Id = tChild.ParentId
GROUP BY tParent.Id

如何使用Linq to SQL查询重新编写C#以生成优化查询?

2 个答案:

答案 0 :(得分:1)

嗯,以下LINQ to Entities查询生成与优化查询相同的SQL。它基本上是一对一的SQL到LINQ转换,但IMO不是非常直观的描述查询目标的方式。无论如何,这是:

var query =
    from parent in Context.tParent
    from child in parent.tChild.DefaultIfEmpty()
    group child by parent.Id into g
    select g.Sum(child => child != null ? 1 : 0) > 0 ? true : false;

答案 1 :(得分:0)

此查询返回至少一个孩子的所有父母:

var result = Context.tChild.Select(child => child.tParent)
    .Distinct().ToList();