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.cat
或from 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='多流嵌套'"