使用GROUP BY和COUNT优化/重写LINQ查询

雪熊

我正在尝试在以下数据集上按名称分组的独特的Foos和Bars计数。

Id  |   IsActive    |   Name    |   Foo     |   Bar
1   |       1       |   A       |   11      |   null
2   |       1       |   A       |   11      |   null
3   |       1       |   A       |   null    |   123
4   |       1       |   B       |   null    |   321

我希望以上数据的结果为:

Expected:
A = 2;
B = 1;

我试图按名称,Foo,Bar进行分组,然后再次按名称进行分组以得到“行”计数。但这并没有给我正确的结果。(或者ToDictionary扔了一个重复的钥匙,我玩了很多,所以记不清了)

db.MyEntity
    .Where(x => x.IsActive)
    .GroupBy(x => new { x.Name, x.Foo, x.Bar })
    .GroupBy(x => new { x.Key.Name, Count = x.Count() })
    .ToDictionary(x => x.Key, x => x.Count);

所以我想到了这个LINQ查询。但这很慢。

db.MyEntity
    .Where(x => x.IsActive)
    .GroupBy(x => x.Name)
    .ToDictionary(x => x.Key,
        x =>
            x.Where(y => y.Foo != null).Select(y => y.Foo).Distinct().Count() +
            x.Where(y => y.Bar != null).Select(y => y.Bar).Distinct().Count());

我该如何优化呢?

这是推荐实体

public class MyEntity
{
    public int Id { get; set; }
    public bool IsActive { get; set; }
    public string Name { get; set; }
    public int? Foo { get; set; }
    public int? Bar { get; set; }
}

编辑

我也试过这个查询

db.MyEntity
    .Where(x => x.IsActive)
    .GroupBy(x => new { x.Name, x.Foo, x.Bar })
    .GroupBy(x => x.Key.Name)
    .ToDictionary(x => x.Key, x => x.Count());

但这引发了超时异常:(

务实的

查询效率极低,因为您需要在客户端执行大量工作(构建字典所涉及的所有工作),而又无法使用数据库进行预测。这是一个问题,这不仅是因为数据库(特别是如果对这些值建立索引)比客户端可以更快地完成此工作,而且还因为在数据库上进行投影所涉及的数据要少得多,因此通过网络发送的数据要少得多。

因此,对数据进行分组之前,只需进行预测即可

var activeItems = db.MyEntity.Where(x => x.IsActive);

var query = activeItems.Select(x => new { Name, Value = x.Foo}).Distinct()
    .Concat(activeItems.Select(x => new { Name, Value = x.Bar}).Distinct())        
    .Where(x => x != null)
    .GroupBy(pair => pair.Name)
    .Select(group => new { group.Key, Count = Group.Count()})
    .ToDictionary(pair => pair.Key, pair => pair.Count);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

LINQ查询从SQL转换,SQL使用包含GROUP BY和COUNT的子查询

来自分类Dev

使用多个联接和谓词优化LINQ查询

来自分类Dev

使用GROUP BY和COUNT执行SQL UPDATE

来自分类Dev

使用sum和group by将sql查询转换为linq

来自分类Dev

使用实体框架优化LINQ查询

来自分类Dev

具有GROUP BY和COUNT的LINQ

来自分类Dev

SUM和GROUP BY使用子查询

来自分类Dev

使用Count和2个表的MYSQL查询优化问题

来自分类Dev

使用UNION和GROUP BY的AS

来自分类Dev

LINQ查询从SQL转换,SQL使用包含GROUP BY和COUNT的子查询

来自分类Dev

使用linq group by语句作为子查询

来自分类Dev

使用GROUP BY的子查询中的MySQL COUNT

来自分类Dev

通过LINQ迭代到包含COUNT和GROUP BY的SQL查询

来自分类Dev

使用Group By和Let的LINQ查询

来自分类Dev

GROUP BY如何使用COUNT(*)

来自分类Dev

使用实体框架优化LINQ查询

来自分类Dev

LINQ优化使用对整数集合的单个查询

来自分类Dev

使用ActiveRecord的GROUP BY和COUNT

来自分类Dev

在多个字段SUM和COUNT上使用GROUP BY的Linq查询

来自分类Dev

如何优化同时取决于COUNT和GROUP BY的查询?

来自分类Dev

使用 COUNT 、 GROUP BY 、 INTERVAL 和 LIMIT 创建 Django pgSQL 查询

来自分类Dev

MySql GROUP BY 使用文件排序 - 查询优化

来自分类Dev

如何使用 `COUNT` 和 `GROUP BY` 编写 JPQL 查询

来自分类Dev

LINQ IQueryable with group by 和 count

来自分类Dev

使用 GROUP BY ALL 重写查询

来自分类Dev

如何使用 linq GROUP BY multiple 和 SELECT 查询

来自分类Dev

在 where 子句中使用自联接和 group bys 优化查询

来自分类Dev

使用包含 GROUP BY 子句的表连接重写查询

来自分类Dev

使用多个包含语句优化 linq 查询

Related 相关文章

热门标签

归档