Chciałbym się dowiedzieć które klauzule w Linq wykonują zapytania po stronie sql?
Slyszałem też że da się tworzyc projekcje które jeszcze nie wykonują sie na bazie?
Select,
Where,
Orderby,
Group,
Join**
Chciałbym się dowiedzieć które klauzule w Linq wykonują zapytania po stronie sql?
Slyszałem też że da się tworzyc projekcje które jeszcze nie wykonują sie na bazie?
Select,
Where,
Orderby,
Group,
Join**
np ToList()
;-)
Generalnie zapytanie leci do bazy po wywołaniu ToList()
, ToArray()
lub ToDictionary()
+ wszystkie metody zwracające pojedynczą wartość np. First()
, Single()
lub Count()
. Wszystko co zwraca IQueryable
nie jest jeszcze zapytaniem a dopiero jakby obietnicą wykonania zapytania.
Np. Nie kownerteruje danego zpaytania do toList() i przy pomocy : _context.Database.Log = d=> System.Diagnostics.Debug.WriteLine(d); Widze ile trwa dane zapytanie na bazie. Podobno nie miało to zapytanie iść do bazy i nie powinien pomiar się zrobić ? :D
Używam np. jedynie Select().OrderBy.Take
No jak zaczniesz iterować po tej kolekcji w zapytanie na bazie się wykona.
Po chyba każdej może.
Po poniższym zapytaniu w logach widzę ile trwało zapytanie na bazie. Przecież nie wykonuję żadnego toList(), ani nic wiec chyba nie powinienem widzieć za pomocą logów bazy ile trwa zapytanie?
var list = _context.Database.Log = d => System.Diagnostics.Debug.WriteLine(d);
var list = _context.Tabela1
.Join(_context.Tabela2,
x => x.Tabela2Id,
e => e.Id,
(tabela1, Tabela2) => new JakisViewModel
{
Id = tabela.Id,
})
.Take(count);
Completed in 3 ms with result: SqlDataReader
Nie macie tam jakiegoś lepszego loggera, który by pokazał SQL lub drzewko? a te 3ms to nie jest przetłumaczenie linq?
No taki kod co podałeś to na pewno nie wykona zapytania. Log według mnie wynika z tego, że gdzieś poza tym kodem odwołujesz się do tej zmiennej list
na przykład poprzez iterację. Jest to bardzo brzydkie bo wtedy strzał do bazy leci z różnych miejsc w aplikacji dlatego robi się zazwyczaj ToList
lub coś podobnego.
Wystarczy, że napiszesz w LINQ coś, co nie uda się wykonać po stronie bazy.
np.
var date1 = DateTime.Now;
var wynik = context.table1.Where(x => x.Date > Date1);