Dziękuje. Teraz wiadomo już znacznie więcej. Ilość zwracanych danych nie jest w tym przypadku aż tak istotna. Bardziej istotna jest sama forma tego zapytania oraz postać generowanego zapytania SQL. Przy pomocy profilera SQL można je podejrzeć. Widać wówczas, że wynikowy SQL zawiera 115 JOIN-ów. Stosując drobną optymalizację można zmniejszyć ilość JOIN-ów do 36 (warunek WHERE ze względu na brak interfejsu użytkownika jest nieco inny niż w Pani przykładzie)
zamowienia.Dane.Wszystkie()
.Where(x => x.DataWprowadzenia > new DateTime(2000, 5, 1) &&
x.DataWprowadzenia < new DateTime(2020, 12, 31) &&
(x.FlagaWlasna == null || x.FlagaWlasna.Id == 1230))
.Select(x => new
{
Dok = x,
Podmiot = x.Podmiot,
Adres = x.Podmiot.AdresPodstawowy.Szczegoly,
AdresDostaw = x.Podmiot.DomyslnyAdresDostaw.Szczegoly,
})
.Select(select => new Zk()
{
id = select.Dok.Id,
numerZamowienia = select.Dok.NumerZewnetrzny,
numerZk = select.Dok.NumerWewnetrzny.PelnaSygnatura,
chcekd = false,
data = select.Dok.DataWprowadzenia,
waluta = select.Dok.Waluta.Symbol,
kontrahent = new Zk.Kontrahent()
{
nazwa = select.Podmiot.AdresPodstawowy.Nazwa,
nazwaSkrocona = select.Podmiot.NazwaSkrocona,
miejscowosc = select.Adres.Miejscowosc,
kodPocztowy = select.Adres.KodPocztowy,
nrDomu = select.Adres.NrDomu,
nrLokalu = select.Adres.NrLokalu,
ulica = select.Adres.Ulica,
mail = select.Podmiot.Kontakty.Where(k => k.Podstawowy == true && k.Rodzaj.Id == rodzajeKontaktu).FirstOrDefault().Wartosc,
nip = select.Podmiot.NIP,
firma = select.Podmiot.Firma.Nazwa
},
kontrahentDostawa = new Zk.Kontrahent()
{
nazwa = select.AdresDostaw.Adres.Nazwa,
miejscowosc = select.AdresDostaw.Miejscowosc,
kodPocztowy = select.AdresDostaw.KodPocztowy,
nrDomu = select.AdresDostaw.NrDomu,
nrLokalu = select.AdresDostaw.NrLokalu,
ulica = select.AdresDostaw.Ulica,
},
produkty = select.Dok.Pozycje
.Select(p => new Zk.Produkt()
{
ilosc = p.Ilosc,
indeks = p.AsortymentAktualny.Symbol,
typ = p.RodzajAsortymentuId,
cena = p.Cena.BruttoPrzedRabatem,
rabat = p.Cena.RabatProcent,
vat = p.StawkaVat.Stawka,
})
})
.ToList()
Jednak najlepszą optymalizację można uzyskać zmieniając nieco formę zapytania. Wówczas ilość JOIN-ów zmniejsza się do 17.
(from z in zamowienia.Dane.Wszystkie()
let podmiot = z.Podmiot
let adres = podmiot.AdresPodstawowy
let adresSzczegoly = adres.Szczegoly
let adresDostaw = podmiot.DomyslnyAdresDostaw
let adresDostawSzczegoly = adresDostaw.Szczegoly
where z.DataWprowadzenia > new DateTime(2000, 5, 1) &&
z.DataWprowadzenia < new DateTime(2020, 12, 31) &&
(z.FlagaWlasna == null || z.FlagaWlasna.Id == 1230)
select new Zk()
{
id = z.Id,
numerZamowienia = z.NumerZewnetrzny,
numerZk = z.NumerWewnetrzny.PelnaSygnatura,
chcekd = false,
data = z.DataWprowadzenia,
waluta = z.Waluta.Symbol,
kontrahent = new Zk.Kontrahent()
{
nazwa = adres.Nazwa,
nazwaSkrocona = podmiot.NazwaSkrocona,
miejscowosc = adresSzczegoly.Miejscowosc,
kodPocztowy = adresSzczegoly.KodPocztowy,
nrDomu = adresSzczegoly.NrDomu,
nrLokalu = adresSzczegoly.NrLokalu,
ulica = adresSzczegoly.Ulica,
mail = podmiot.Kontakty.Where(k => k.Podstawowy == true && k.Rodzaj.Id == rodzajeKontaktu).FirstOrDefault().Wartosc,
nip = podmiot.NIP,
firma = podmiot.Firma.Nazwa
},
kontrahentDostawa = new Zk.Kontrahent()
{
nazwa = adresDostaw.Nazwa,
miejscowosc = adresDostawSzczegoly.Miejscowosc,
kodPocztowy = adresDostawSzczegoly.KodPocztowy,
nrDomu = adresDostawSzczegoly.NrDomu,
nrLokalu = adresDostawSzczegoly.NrLokalu,
ulica = adresDostawSzczegoly.Ulica,
},
produkty = z.Pozycje
.Select(p => new Zk.Produkt()
{
ilosc = p.Ilosc,
indeks = p.AsortymentAktualny.Symbol,
typ = p.RodzajAsortymentuId,
cena = p.Cena.BruttoPrzedRabatem,
rabat = p.Cena.RabatProcent,
vat = p.StawkaVat.Stawka,
})
}).ToList()