C# 实体框架生成巨大的查询,并且需要很长时间来构建
我有一个包含大量连接的LINQ查询。但是当我执行查询时,EF需要很长时间来编译它(大约25秒)。当我查看生成的SQL时,我看到它使用了很多联合调用。为什么会这样?为什么它不能生成连接呢 这些类来自数据库(数据库优先) LINQ查询如下所示: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
(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
周围的“星”来收集数据,因此您可以轻松地将其分解为多个查询,这无疑会大大加快速度。一个查询并不总是比多个查询快。请使用存储过程