我有一个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个属性,它也会获得表中的每一列。