tutorial sintaxis realizar principiantes para lectura instrucciones español ejemplos datos consultas consulta con c# sql linq linq-to-sql linq-to-objects

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 del Article con Id == 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.