Jak optymalnie pobierać dane z bazy danych

0

Witam, jak optymalnie pobierać dane o określonych wymaganiach z kontekstu bazy danych?

    List<City> cities = context.City.Where(...);
    List<City> cities = context.City;
    cities = cities.Where(...);

Czy jest jeszcze inny sposób?

1

Jaka według ciebie jest różnica pomiędzy 1 i 2?

0

W pierwszym przypadku jest kilka call'ów do bazy danych, bo pod wherem kryje się pętla, a w drugim najpierw z bazy pobieramy wszystkie dane a dopiero później już pobrane filtrujemy

0
ZielonySzczypior napisał(a):

W pierwszym przypadku jest kilka call'ów do bazy danych, bo pod wherem kryje się pętla, a w drugim najpierw z bazy pobieramy wszystkie dane a dopiero później już pobrane filtrujemy

Nie wiem czego używasz, ale EF whery sobie do sql zamienia, i dopiero wykonuje na bazie.

Poza tym oba się nie skompilują, bo brak ToList();.

2

Generalnie powinieneś starać się aby zapytanie zostało wykonane po stronie bazy, a nie aplikacji, więc jedno zapytanie które zwróci Ci wszystkie potrzebne dane jest pożądane.

Pobieranie całej bazy do pamięci może mieć sens jeżeli danych jest niewiele np. jakiś słownik.

Jeżeli chodzi o pętle, to robienie czegoś takiego

var ids = new [] {1,2,3,4,5,6};

var user = new List<User>();

foreach (var id in ids)
	users.Add(_context.Users.First(x => x.Id == id));

to zły pomysł

1
ZielonySzczypior napisał(a):

W pierwszym przypadku jest kilka call'ów do bazy danych, bo pod wherem kryje się pętla, a w drugim najpierw z bazy pobieramy wszystkie dane a dopiero później już pobrane filtrujemy

No dobra, a skąd czerpiesz wiedzę, że pod where kryje się jakaś pętla, która powoduje wysłanie wielu zapytań do bazy?

Tak jest dobrze, bo filtrowanie odbędzie się po stronie bazy:

var cities = context.Cities.Where(c => c.Name != "Łomża").ToList();

Tak jest źle, bo najpierw pobierana jest cała tabela, a filtrowanie odbywa się po stronie aplikacji, co jest złe. Gorsze niż syfilis, tasiemiec a nawet Entity Framework.

var cities = context.Cities.ToList();
var someCities = cities.Where(c => c.Name != "Łomża");

Żeby mieć kilka zapytań do bazy, to trzeba jakoś zrobić n + 1, czyli mieć włączony lazy loading i robić projekcję używając jakiejś właściwości, coś w stylu:

var cities = context.Cities.Select(c => new SomeResult { CityName = c.Name, VoivodeshipName = c.Voivodeship.Name  }).ToList();

Ale skąd wziąć pętlę, to nie wiem. :P

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