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?
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?
Jaka według ciebie jest różnica pomiędzy 1 i 2?
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
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();
.
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ł
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