Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架生成巨大的查询,并且需要很长时间来构建_C#_Sql Server_Entity Framework_Linq - Fatal编程技术网

C# 实体框架生成巨大的查询,并且需要很长时间来构建

C# 实体框架生成巨大的查询,并且需要很长时间来构建,c#,sql-server,entity-framework,linq,C#,Sql Server,Entity Framework,Linq,我有一个包含大量连接的LINQ查询。但是当我执行查询时,EF需要很长时间来编译它(大约25秒)。当我查看生成的SQL时,我看到它使用了很多联合调用。为什么会这样?为什么它不能生成连接呢 这些类来自数据库(数据库优先) LINQ查询如下所示: (from persoon in PagedView.Context.PERSOON join verhuring in PagedView.Context.VERHURINGEN .Where( x

我有一个包含大量连接的LINQ查询。但是当我执行查询时,EF需要很长时间来编译它(大约25秒)。当我查看生成的SQL时,我看到它使用了很多联合调用。为什么会这样?为什么它不能生成连接呢

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

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代码如下所示:

    (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())
编辑:我正在一点一点地分解我的查询,但它仍然会生成大量不必要的数据:

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
                }

这一切仍然是这样。尽管我只需要
verhuringen
中的3个属性,但它会获取表中的每一列。

尝试创建一个DB视图(或多个视图)。生成联合比“仅生成联合”要快得多,因为联合会增加返回行的数量,而联合只会添加返回行。您可以通过将查询手动写入纯联接来验证这一点。由于您主要以
persoon
周围的“星”来收集数据,因此您可以轻松地将其分解为多个查询,这无疑会大大加快速度。一个查询并不总是比多个查询快。请使用存储过程