linq查询交叉连接组优化

时间:2015-06-19 21:33:09

标签: linq optimization linq-to-sql

我有以下数据库模型:http://i.stack.imgur.com/gRtMD.png Kunde_Geraet / Kunde_Anwendung的多对多关系在显式映射表中,附带信息。

我想优化以下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))而没有联合的null值,那就更好了。

我尝试将其作为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(应用)/ Geraete(设备)的Count()到由Key Kunde(客户)分组的列表

1 个答案:

答案 0 :(得分:1)

请勿使用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)
}

现在你有了获得计数的基础等等。