Potrzebuję zamówić artykuły przechowywane w bazie danych według malejącej daty publikacji, a następnie pierwsze 20 rekordów po artykule z Id == 100
.Jak zaimplementować plik SkipWhile za pomocą Linq do Sql bez wcześniejszego załadowania całej listy do pamięci?
To, co chciałbym zrobić z Linq:
IQueryable<Article> articles =
db.Articles
.OrderByDescending(a => a.PublicationDate)
.SkipWhile(a => a.Id != 100)
.Take(20);
Jednak ta generuje NotSupportedException ponieważ SkipWhile
nie jest obsługiwana w LINQ do SQL (patrz here).
Możliwym rozwiązaniem jest wykonanie zapytania, a następnie zastosować SkipWhile
użyciu LINQ do obiektu:
IEnumerable<ArticleDescriptor> articles =
db.Articles
.OrderByDescending(a => a.PublicationDate)
.ToList()
.SkipWhile(a => a.Article.Id != 100)
.Take(20);
Ale to znaczy, że trzeba załadować całość uporządkowaną listę do pamięci, a następnie wziąć 20 artykułów po jednej z Id == 100
.
Czy istnieje sposób na uniknięcie tego ogromnego zużycia pamięci?
Bardziej ogólnie, jaki jest najlepszy sposób osiągnięcia tego w SQL?
Ciekawe wymogu. Czy istnieje jakiś związek między 'Id' i' PublicationDate'? Czy to, co chcesz zrobić, aby je zamówić według daty, przejdź do tej listy, aż dojdziesz do "Id" 100, a * następnie * weź 20 kolejnych? – AakashM
Tak, właśnie tego chcę. Nie ma związku pomiędzy 'Id' i' PublicationDate'. Powodem tego wymogu jest to, że muszę pobrać pewną liczbę artykułów opublikowanych po określonym artykule, z których wiem tylko "Id". Oczywiście, gdybym znał 'PublicationDate' tego artykułu, byłoby to znacznie łatwiejsze. –