Pozdrowienia, mam następujące pytanie. Nie znalazłem na to dokładnej odpowiedzi i jest to dla mnie naprawdę interesujące. Załóżmy, że mam następujący kod, który pobiera rekordy z bazy danych (na przykład, aby wyeksportować je do pliku XML).Czy LINQ jest leniwy?
var result = from emps in dc.Employees
where emps.age > 21
select emps;
foreach (var emp in result) {
// Append this record in suitable format to the end of XML file
}
Załóżmy, że istnieje milion rekordów spełniających gdzie warunek w kodzie. Co się stanie? Wszystkie te dane będą pobierane z programu SQL Server natychmiast do pamięci środowiska wykonawczego, gdy dotrą do konstruktu foreach, lub zostanie on następnie pobrany, co jest konieczne, pierwszy rekord, drugi. Innymi słowy, czy LINQ naprawdę radzi sobie z sytuacją z iterowaniem przez duże kolekcje (zobacz mój post tutaj dla szczegółów)?
Jeśli nie, jak rozwiązać problemy z pamięcią w takim przypadku? Jeśli naprawdę muszę przejść przez dużą kolekcję, co powinienem zrobić? Oblicz rzeczywistą ilość elementów w kolekcji za pomocą funkcji Count, a następnie odczytaj dane z bazy danych małymi porcjami. Czy istnieje prosty sposób na wdrożenie stronicowania przy użyciu frameworka LINQ?
+1 Używam do tego prawie identycznej funkcji. – alex
Nie sądzę, że więcej trafień do SQL Server będzie tak wielkim problemem z wydajnością, jeśli ustawimy poprawnie rozmiar strony. Powinno to być około 1000 wierszy na moim przykładzie, a gdy aplikacja będzie głównie zajęta eksportowaniem, nie będzie wysyłania zapytań do bazy danych. –
@ Spirit_1984 - Zgadzam się z tobą. Wolałbym mieć więcej haseł do SQL Server niż próba załadowania milionów wierszy do pamięci. –