首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架优化计数子实体

实体框架优化计数子实体
EN

Stack Overflow用户
提问于 2016-07-19 11:18:45
回答 2查看 367关注 0票数 1

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

C#

代码语言:javascript
复制
List<bool> isUsed = Context.tParent.Select(parent => 
    parent.tChild.Any()
).ToList();

这将产生以下SQL

生成的SQL

代码语言:javascript
复制
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]

不幸的是,这表现很差(我真正的查询检查了许多链接表的计数),如果按照下面的方式重写查询,速度就会大大提高。

优化查询

代码语言:javascript
复制
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

如何重写C#以使用Linq查询生成优化的查询?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-19 11:46:43

好的,下面的LINQ与优化的查询有效地产生相同的SQL。它基本上是一对一的SQL到LINQ翻译,但IMO并不是很直观地描述查询目标。总之,这里是:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-07-19 11:31:56

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

代码语言:javascript
复制
var result = Context.tChild.Select(child => child.tParent)
    .Distinct().ToList();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38457032

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档