gpt4 book ai didi

c# - groupby 内部 groupby 和 All() 性能

转载 作者:太空宇宙 更新时间:2023-11-03 21:02:35 28 4
gpt4 key购买 nike

我有一个将数据分组两次的查询:

var query = (from a in Context.SetA()
from b in Context.SetB().Where(x => x.aId == a.Id) // 1-to-many
from c in Context.SetC().Where(x => x.bId == b.Id) // 1-to-many
group new {...} by new {...} into g
select new
{
g.Key.X,
g.Key.Y,
g.Sum(x => x....), // etc, lots of Sums
});

from (q in query
group q by true
select new
{
g.Key.Z,
g.Sum(x => x.....), // etc, lots of Sums
});

这一切都很好,性能是可以接受的。现在,当我在两个分组中添加 All(或 Any,没有区别)时

g.All(x => x.Flag)

性能急剧下降。它变得慢了 10 倍,从 5 秒到 50 秒。数字不准确,只是为了得到这个想法。

我进行了两次分组,因为我有三个级别的一对多关系,并且我在所有级别上进行汇总(父值之和、子值之和和孙值之和)。

有什么想法可以提高性能吗?

最佳答案

问题是没有自然的 SQL GROUP BY 聚合可以映射到应用于分组的 All/Any,所以EF SQL 翻译效率低下。

解决方案是使用它们的聚合等价物。

所以代替

g.All(x => x.Flag)

你可以用

g.Min(x => x.Flag ? 1 : 0) == 1

分别

g.Any(x => x.Flag)

可以替换为

g.Max(x => x.Flag ? 1 : 0) == 1

更新:奇怪的是,EF 为上述表达式生成了 2 个 MIN/MAX 调用。通过在末尾(== 1 之后)添加违反直觉的 来解决哪个问题?真:假

关于c# - groupby 内部 groupby 和 All() 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43911406/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com