Jaki jest odpowiednik SQL .Skip()
metody w LINQ?
Na przykład: Chciałbym wybrać wiersze 1000-1100 z określonej tabeli bazy danych.
Czy jest to możliwe tylko w przypadku SQL? A może muszę zaznaczyć całą tabelę, a następnie znaleźć wiersze w pamięci? Najlepiej byłoby tego uniknąć, jeśli to możliwe, ponieważ stół może być dość duży.
.net
sql
sql-server
Promień
źródło
źródło
SQL Server 2012 i nowsze wersje dodały następującą składnię:
SELECT * FROM Sales.SalesOrderHeader ORDER BY OrderDate OFFSET (@Skip) ROWS FETCH NEXT (@Take) ROWS ONLY
źródło
LINQ to SQL robi to za pomocą funkcji okienkowej ROW_NUMBER:
SELECT a,b,c FROM (SELECT a,b,c, ROW_NUMBER() OVER (ORDER BY ...) as row_number FROM Table) t0 WHERE to.row_number BETWEEN 1000 and 1100;
To działa, ale potrzeba wytworzenia row_number z ORDER BY może skutkować posortowaniem zapytania po stronie serwera i spowodować problemy z wydajnością. Nawet jeśli indeks może spełnić wymaganie ORDER BY, zapytanie nadal musi policzyć 1000 wierszy, zanim zacznie zwracać wyniki. Zbyt często programiści o tym zapominają i po prostu wrzucają kontrolę paginacji do tabeli 5 milionów wierszy i zastanawiają się, dlaczego pierwsza strona jest zwracana o wiele szybciej niż ostatnia ...
Niemniej jednak, użycie ROW_NUMBER () jest prawdopodobnie najlepszą równowagą między łatwością użycia a dobrą wydajnością, pod warunkiem, że unikasz sortowania (warunek ORDER BY można spełnić za pomocą indeksu).
źródło
Spróbuj tego:
select * from [Table-Name] order by [Column-Name] offset [Skip-Count] rows FETCH NEXT [Take-Count] rows only
Przykład:
select * from Personals order by Id offset 10 rows --------->Skip 10 FETCH NEXT 15 rows only --------->Take 15
źródło
Zrób to:
Uruchom .Skip (1000). Weź (100) w kontekście danych LINQ to SQL i spójrz na dane wyjściowe SQL. Wygeneruje dla Ciebie instrukcję SQL, która zrobi to, co opisujesz.
Nie będzie tak elegancka, ale spełnia swoje zadanie.
źródło
Nie, ale możesz emulować klauzulę LIMIT MySQL (łącze przepełnienia stosu), aby osiągnąć ten sam wynik.
źródło