实体框架生成大量查询,需要很长时间才能构建

时间:2017-03-03 13:35:44

标签: c# sql-server entity-framework linq

我有一个LINQ查询,有很多连接。但是当我执行查询时,EF需要很长时间来编译它(大约25秒)。当我查看生成的SQL时,我发现它使用了很多UNION ALL。为什么这样做?为什么不能只生成连接呢?

这些类来自数据库(数据库优先)

LINQ查询如下所示:

    (from persoon in PagedView.Context.PERSOON
    join verhuring in PagedView.Context.VERHURINGEN
        .Where(
            x => x.DatumGeldigTot == null || x.DatumGeldigTot >= OverzichtPersonenSearch.ReferentieDatum)
    on persoon.ComputerNr equals verhuring.PersoonsID into a
    from verhuring in a.DefaultIfEmpty()
    join eenheid in PagedView.Context.EENHEID
    on verhuring.Eenheid equals eenheid.ComputerNr into b
    from eenheid in b.DefaultIfEmpty()
    join data in PagedView.Context.DATA
    on persoon.ComputerNr equals data.COMPUTERNR into c
    join huur in PagedView.Context.HUURPRIJSM
    on persoon.ComputerNr equals huur.PERSOON into d
    from mtb in d.OrderByDescending(x => x.INVOEGE).GroupBy(x => x.PERSOON).Select(x => x.FirstOrDefault()).DefaultIfEmpty()
    join insch in PagedView.Context.INSCHRIJVINGEN
    on persoon.ComputerNr equals insch.PERSOONSID into e
    from insch in e.DefaultIfEmpty()
    join att in PagedView.Context.ATTESTEN
    on persoon.ComputerNr equals att.COMPUTERNR into f
    select new PersoonDto
    {
        ComputerNr = persoon.ComputerNr,
        EIGENREF = persoon.EIGENREF,
        NAAM = persoon.NAAM,
        ADRES = persoon.ADRES,
        LANDCODE = persoon.LANDCODE,
        POSTNR = persoon.POSTNR,
        TELEFOON = persoon.TELEFOON,
        EMAIL = persoon.EMAIL,
        RIJKSREGISTER = persoon.RIJKSREGISTER,
        SOORT_PERSOON = persoon.SOORT_PERSOON,
        GESLACHT = persoon.GESLACHT,
        DATUM = persoon.DATUM,
        FAMILIENAAM = persoon.FAMILIENAAM,
        VOORNAAM = persoon.VOORNAAM,
        STRAAT = persoon.STRAAT,
        NR = persoon.NR,
        BUSNR = persoon.BUSNR,
        Website = persoon.Website,
        IsActief = persoon.IsActief,
        Verhuringen = persoon.Verhuringen,
        POSTNRS = persoon.POSTNRS,
        BANKREKENING_IBAN = persoon.BANKREKENING_IBAN,
        GEBOORTELAND = persoon.GEBOORTELAND,
        GEBOORTEPLAATS = persoon.GEBOORTEPLAATS,
        GEBOORTEDATUM = persoon.GEBOORTEDATUM,
        BANKREKENINGOGM = persoon.BANKREKENINGOGM,
        Nationaliteit = persoon.Nationaliteit,
        DUBIEUZEHUURDER = persoon.DUBIEUZEHUURDER,
        BEROEP = persoon.BEROEP,
        DATA = c.ToList(),
        MaandelijksHuurBedrag = mtb.MTEBETEUR,
        CATEGORIE = persoon.CATEGORIE,
        FacRequest = persoon.FacRequest,
        Inschrijvingen = insch,
        ATTESTEN = f.ToList(),
        Een = eenheid
    }).OrderByDescending(p => p.ComputerNr).GroupBy(x => x.ComputerNr).Select(x=> x.FirstOrDefault())

它生成的SQL代码如下所示:SQL query

编辑:我正在逐步分解我的查询,但它仍会产生大量不必要的数据:

from persoon in PagedView.Context.PERSOON
join verhuring in PagedView.Context.VERHURINGEN.Select(x => new 
    {
        DatumGeldigTot = x.DatumGeldigTot,
        Eenheid = x.Eenheid,
        PersoonsID = x.PersoonsID
    })
    .Where(
        x => x.DatumGeldigTot == null || x.DatumGeldigTot >= OverzichtPersonenSearch.ReferentieDatum)
on persoon.ComputerNr equals verhuring.PersoonsID into a
from verhuring in a.DefaultIfEmpty()
select new PersoonDto
                {
                    ComputerNr                         = persoon.ComputerNr,
                    EIGENREF                           = persoon.EIGENREF,
                    NAAM                               = persoon.NAAM,
                    ADRES                              = persoon.ADRES,
                    LANDCODE                           = persoon.LANDCODE,
                    POSTNR                             = persoon.POSTNR,
                    TELEFOON                           = persoon.TELEFOON,
                    EMAIL                              = persoon.EMAIL,
                    RIJKSREGISTER                      = persoon.RIJKSREGISTER,
                    GESLACHT                           = persoon.GESLACHT,
                    DATUM                              = persoon.DATUM,
                    FAMILIENAAM                        = persoon.FAMILIENAAM,
                    VOORNAAM                           = persoon.VOORNAAM,
                    STRAAT                             = persoon.STRAAT,
                    NR                                 = persoon.NR,
                    BUSNR                              = persoon.BUSNR,
                    Website                            = persoon.Website,
                    IsActief                           = persoon.IsActief,
                    Verhuringen                        = persoon.Verhuringen,
                    POSTNRS                            = persoon.POSTNRS,
                    BANKREKENING_IBAN                  = persoon.BANKREKENING_IBAN,
                    GEBOORTELAND                       = persoon.GEBOORTELAND,
                    GEBOORTEPLAATS                     = persoon.GEBOORTEPLAATS,
                    GEBOORTEDATUM                      = persoon.GEBOORTEDATUM,
                    BANKREKENINGOGM                    = persoon.BANKREKENINGOGM,
                    Nationaliteit                      = persoon.Nationaliteit,
                    DUBIEUZEHUURDER                    = persoon.DUBIEUZEHUURDER,
                    BEROEP                             = persoon.BEROEP
                }

这一切仍然是sql query。即使我只需要verhuringen中的3个属性,它也会获得表中的每一列。

0 个答案:

没有答案