2019. március 23., szombat

Gyorskeresés

Napi Linq

Írta: | Kulcsszavak: linq . entity framework . sql . ef

[ ÚJ BEJEGYZÉS ]

Tételezzük fel, hogy Entity Framework forrásból kérdezünk le olyan módon, hogy több eredményhalmazt kapcsolunk össze, majd valamilyen módon kiszedünk belőle 1 elemet.

var max = _context.EntitySet.Where(expr1)
.Union(_context.EntitySet.Where(expr2))
.Union(_context.EntitySet.Where(expr3))
.Union(_context.EntitySet.Where(expr1))
.Max(maxExpr);

Aggodalomra semmi ok, rendben működik, IQueryable<T>, nagyjából normális, egy nagy SQL lekérdezés lesz belőle. Vagy mégsem?

Sajnos nem teljesen, mert messze nem lesz optimális a generált SQL kód, ugyanis sub select-eket fog gyártani nekünk DISTINCT-tel ellátva, majd azokat fogja össze UNION-nal, ami elég pazarló, mert többször megismétli ugyanazokat a műveleteket teljesen feleslegesen, emiatt írjuk át a következőre:

var max = _context.EntitySet.Where(expr1)
.Concat(_context.EntitySet.Where(expr2))
.Concat(_context.EntitySet.Where(expr3))
.Concat(_context.EntitySet.Where(expr1))
.Max(maxExpr);

Az Union()-t lecsréltem Concat()-ra, aminek az lesz az eredménye, hogy eltűnik a sub select-tekből a plusz DISTINCT (talán más egyéb is, ha olyan a lekérdezés), helyette majd csak a végén fogja megcsinálni, amit szeretnénk, így rengeteg időt spórol nekünk, a lekérdezésünk jóval gyorsabb lesz, mindezt meg lehet figyelni konkrét példán keresztül az Sql Server által előállított végrehajtási terven is.

Hozzászólások

(#1) Athlon64+


Athlon64+
(őstag)

[ értesítő ]

További hozzászólások megtekintése...
Copyright © 2000-2019 PROHARDVER Informatikai Kft.