linq查询通过优化交叉连接组
linq query crossjoin groupby optimize
我有以下数据库模型:http://i.stack.imgur.com/gRtMD.png
Kunde_Geraet/Kunde_Anwendung 的多对多关系在显式映射-Table 中带有附加信息。
我想优化以下 LINQ 查询:
var qkga = (from es in db.Eintrag_Systeme.Where(es => es.Eintrag_ID == id)
from kg in db.Kunde_Geraet.Where(kg => es.Geraet_ID == kg.Geraet_ID)
select new { Kunde = kg.Kunde, Geraet = es.Geraet, Anwendung = es.Anwendung })
.Union(
from es in db.Eintrag_Systeme.Where(es => es.Eintrag_ID == id)
from ka in db.Kunde_Anwendung.Where(ka => es.Anwendung_ID == ka.Anwendung_ID)
select new { Kunde = ka.Kunde, Geraet = es.Geraet, Anwendung = es.Anwendung })
.GroupBy(kga => kga.Kunde, kga => new {Geraet = kga.Geraet, Anwendung = kga.Anwendung});
如果结果是没有联合空值的 IEnumerable(Kunde, IEnumerable(Geraet), IEnumerable(Anwendung)) 会更好。
我尝试将其作为 SQL 命令
select Count(es.Geraet_ID), null as Anwendung_ID
from Eintrag_Systeme es cross join Kunde_Geraet where es.Geraet_ID = Kunde_Geraet.Geraet_ID AND es.Eintrag_ID = @id
union
select null as Geraet_ID, Count(es.Anwendung_ID)
from Eintrag_Systeme es cross join Kunde_Anwendung where es.Anwendung_ID = Kunde_Anwendung.Anwendung_ID AND es.Eintrag_ID = @id
group by Kunde_ID
但不要将 Anwendungen(Apps)/Geraete(Devices) 的 Count() 获取到按 Key Kunde(Client) 分组的列表
不要使用 join
但导航属性:
from k in context.Kunden
select new
{
Kunde = k,
Geraete = k.Kunde_Geraete.Select(kg => kg.Geraet),
Anwendungen = k.Kunde_Anwendungen.Select(ka => ka.Anwendung)
}
现在你有了一个基础,你可以从中获得计数等。
我有以下数据库模型:http://i.stack.imgur.com/gRtMD.png Kunde_Geraet/Kunde_Anwendung 的多对多关系在显式映射-Table 中带有附加信息。
我想优化以下 LINQ 查询:
var qkga = (from es in db.Eintrag_Systeme.Where(es => es.Eintrag_ID == id)
from kg in db.Kunde_Geraet.Where(kg => es.Geraet_ID == kg.Geraet_ID)
select new { Kunde = kg.Kunde, Geraet = es.Geraet, Anwendung = es.Anwendung })
.Union(
from es in db.Eintrag_Systeme.Where(es => es.Eintrag_ID == id)
from ka in db.Kunde_Anwendung.Where(ka => es.Anwendung_ID == ka.Anwendung_ID)
select new { Kunde = ka.Kunde, Geraet = es.Geraet, Anwendung = es.Anwendung })
.GroupBy(kga => kga.Kunde, kga => new {Geraet = kga.Geraet, Anwendung = kga.Anwendung});
如果结果是没有联合空值的 IEnumerable(Kunde, IEnumerable(Geraet), IEnumerable(Anwendung)) 会更好。
我尝试将其作为 SQL 命令
select Count(es.Geraet_ID), null as Anwendung_ID
from Eintrag_Systeme es cross join Kunde_Geraet where es.Geraet_ID = Kunde_Geraet.Geraet_ID AND es.Eintrag_ID = @id
union
select null as Geraet_ID, Count(es.Anwendung_ID)
from Eintrag_Systeme es cross join Kunde_Anwendung where es.Anwendung_ID = Kunde_Anwendung.Anwendung_ID AND es.Eintrag_ID = @id
group by Kunde_ID
但不要将 Anwendungen(Apps)/Geraete(Devices) 的 Count() 获取到按 Key Kunde(Client) 分组的列表
不要使用 join
但导航属性:
from k in context.Kunden
select new
{
Kunde = k,
Geraete = k.Kunde_Geraete.Select(kg => kg.Geraet),
Anwendungen = k.Kunde_Anwendungen.Select(ka => ka.Anwendung)
}
现在你有了一个基础,你可以从中获得计数等。