Ho bisogno di ordinare gli articoli archiviati in un database decrescente data di pubblicazione e quindi prendere i primi 20 record dopo l'articolo con .Come implementare SkipWhile con Linq su Sql senza prima caricare l'intera lista in memoria?
Questo è quello che vorrei fare con Linq:
IQueryable<Article> articles =
db.Articles
.OrderByDescending(a => a.PublicationDate)
.SkipWhile(a => a.Id != 100)
.Take(20);
Tuttavia, questo genera una NotSupportedException perché SkipWhile
non è supportata in LINQ to SQL (vedi here).
Una possibile soluzione è quella di eseguire la query e quindi applicare SkipWhile
utilizzando Linq to Object:
IEnumerable<ArticleDescriptor> articles =
db.Articles
.OrderByDescending(a => a.PublicationDate)
.ToList()
.SkipWhile(a => a.Article.Id != 100)
.Take(20);
Ma questo significa che ho bisogno di caricare l'intera lista ordinata in memoria e poi prendere 20 articoli dopo quello con Id == 100
.
C'è un modo per evitare questo enorme consumo di memoria?
Più in generale, qual è il modo migliore per ottenere questo in SQL?
requisito Interessante. Esiste una relazione tra 'Id' e' PublicationDate'? È quello che vuoi fare davvero per ordinarli per data, andare lungo quella lista fino ad arrivare a 'Id'' 100', e * poi * prendere i prossimi 20? – AakashM
Sì, è esattamente quello che voglio. Non esiste alcuna relazione tra 'Id' e' PublicationDate'. La ragione di questo requisito è che ho bisogno di recuperare un certo numero di articoli pubblicati dopo un articolo specificato di cui conosco solo l'ID. Certo, se conoscessi il "PublicationDate" di quell'articolo, sarebbe molto più semplice. –