使用来自较低级别组内的顶级组的聚合结果



I have 2 tables A{int id,int grp}, B{int aid,int cat}.

表 B

包含表 A 的记录所属的类别列表,因此 B.aid 是引用 A.id 的外键。

A.id 是表 A 的唯一主键。

B.cat 包含从 1 到 5 的类别编号,A.grp 包含从 1 到 1000 的数字。

A 有 300 万条记录,表 B 大约有 500 万条记录。

对于每个组 A.grp,我需要计算 A 中包含 A.grp 组中 B.cat 条记录数的记录百分比。

因此,如果 A:[{1,1},{2,1},{3,2}], B:[{1,3},{1,4},{

2,3},{3,4}] 则查询结果应为以下 3 列表:R{int grp,int cat,double percent}:[{1,3,100},{1,4,50},{2,4,100}]

如何在 Linq 中使用单个查询来做到这一点?

希望 A 在该查询中

只出现一次,因为我希望能够将 A 替换为 A.Where(e=>一些复杂的表达式),而无需在该查询中多次重复它。

表 A 和 B 将导入到 Linq 到具有外键的实体中,以便可以引用from a in A from b in a.B select b.catfrom b in B select b.A.grp

您可以像这样组合查询

var query = from g in 
              (from a in db.A
               group a by new
               {
                 grp = a.grp
               }
              )
            join c in  
              (from a in db.A
               from b in a.B
               group b by new
               {
                 a.grp,
                 b.cat
               }
              )            
            on g.Key.grp equals c.Key.grp
            select new
            {
              g.Key.grp,
              c.Key.cat,
              percent = c.Count() * 100 / g.Count()
            };

以下是生成所需结果的 SQL 代码:

with grp as (select a.grp,cnt=count(*) from a group by a.grp)
,cat as(select a.grp,b.cat,cnt=count( * ) * 100/grp.cnt
from a
join b on b.aid=a.id
join grp on grp.grp=a.grp
group by a.grp,b.cat,grp.cnt)
select * from cat

下面是生成所需结果的 Linq 代码:

var grp=
        from a in db.A
        group a by new{grp=a.grp}
        ;
var cat=
        from a in db.A
        from b in a.B
        group b by new{a.grp,b.cat}
        ;
var q=from g in grp
        join c in cat on g.Key.grp equals c.Key.grp
        select new{g.Key.grp,c.Key.cat,percent=c.Count()*100/g.Count()};

但是有这样的东西会很好:

from a in db.A
group a by new{grp=a.grp} into grp
from g in grp
from c in g.B
group c by new{gcnt=grp.Count(),c.cat} into cat
from c in cat
select new{c.A.grp,c.cat,cnt=cat.Count()*100/cat.Key.gcnt}

但它给了我以下运行时异常:不支持嵌套查询。操作1='分组依据' 操作2='多流嵌套'"

相关内容

  • 没有找到相关文章

最新更新