realizar - sintaxis linq c#
¿Cómo implementar SkipWhile con Linq en Sql sin cargar primero toda la lista en la memoria? (3)
¿No es la solución agregar una declaración where?
IQueryable<Article> articles = db.Articles.Where(a => a.id != 100).OrderByDescending(a => a.PublicationDate).Take(20);
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 con Id == 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 NotSupportedException porque SkipWhile
no es compatible con Linq a Sql (ver aquí ).
Una posible solución es ejecutar la consulta y luego aplicar SkipWhile
usando Linq to Object:
IEnumerable<ArticleDescriptor> articles =
db.Articles
.OrderByDescending(a => a.PublicationDate)
.ToList()
.SkipWhile(a => a.Article.Id != 100)
.Take(20);
Pero esto significa que necesito cargar primero toda la lista ordenada en la memoria y luego tomar 20 artículos después de la que tiene Id == 100
.
¿Hay alguna manera de evitar este gran consumo de memoria?
Más en general, ¿cuál es la mejor manera de lograr esto en SQL?
Puedes intentar así
var articles =
db.Articles
.Where(a => a.PublicationDate < db.Articles
.Where(aa => aa.Id==100)
.Select(aa => aa.PublicationDate)
.SingleOrDefault())
.OrderByDescending(a => a.PublicationDate)
.Take(20);
Si, como supongo por el nombre de la columna, PublicationDate
no cambia, puede hacerlo en dos consultas separadas:
- Establecer el día de
PublicationDate
delArticle
conId == 100
- Recuperar los 20 artículos desde esa fecha en adelante
Algo como:
var thresholdDate = db.Articles.Single(a => a.Id == 100).PublicationDate;
var articles =
db.Articles
.Where(a => a.PublicationDate <= thresholdDate)
.OrderByDescending(a => a.PublicationDate)
.Take(20);
Incluso es posible que LINQ to SQL pueda traducir esto:
var articles =
db.Articles
.Where(a => a.PublicationDate
<= db.Articles.Single(aa => aa.Id == 100).PublicationDate)
.OrderByDescending(a => a.PublicationDate)
.Take(20);
pero eso puede ser demasiado complejo para eso. Pruébalo y mira.