¿Cómo implementar SkipWhile con Linq a Sql sin cargar primero toda la lista en la memoria?
Necesito ordenar los artículos almacenados en una base de datos descendiendo la fecha de publicación y luego tomar los primeros 20 registros después del artículo conId == 100
.
Esto es lo que me gustaría hacer con Linq:
IQueryable<Article> articles =
db.Articles
.OrderByDescending(a => a.PublicationDate)
.SkipWhile(a => a.Id != 100)
.Take(20);
Sin embargo, esto genera una excepción NotSupportedException porqueSkipWhile
no es compatible en Linq to Sql (veraqu).
Una posible solución es ejecutar la consulta y luego aplicarSkipWhile
usando Linq para Objetar:
IEnumerable<ArticleDescriptor> articles =
db.Articles
.OrderByDescending(a => a.PublicationDate)
.ToList()
.SkipWhile(a => a.Article.Id != 100)
.Take(20);
Pero esto significa que primero necesito cargar toda la lista ordenada en la memoria y luego tomar 20 artículos después del que tieneId == 100
.
¿Hay alguna forma de evitar este gran consumo de memoria?
Más en general, ¿cuál es la mejor manera de lograr esto en SQL?