Po jakich klauzulach w linq jest wykonywane zapytanie na bazie?

0

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**

0

np ToList() ;-)

2

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.

0

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

1

No jak zaczniesz iterować po tej kolekcji w zapytanie na bazie się wykona.

0

Po chyba każdej może.

0

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
0

Nie macie tam jakiegoś lepszego loggera, który by pokazał SQL lub drzewko? a te 3ms to nie jest przetłumaczenie linq?

0

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.

1

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);

1 użytkowników online, w tym zalogowanych: 0, gości: 1