No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Selección dinámica de datos

16/26
Recursos

Aportes 10

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Les comparto mi funcion generica que aprovecha el uso de funciones anonimas como parametros para filtrar, ordenar y seleccionar los datos dandole dinamismo a la implementacion. considere _librosLt como el listado de libros disponibles para consultar

    public IEnumerable<dynamic> GetCustomBook(
        Func<Book, dynamic> select,
        Func<Book, bool> where,
        Func<Book, object> order,
        int take,
        int skip = 0)
    {
        return this._librosLt
            .Where(where)
            .OrderBy(order)
            .Take(take)
            .Select(select);
    }

Y asi seria su invocacion

LinqQueries queries = new LinqQueries();

var selectCustom = queries.GetCustomBook(select: x => new Book { Title = x.Title, PageCount = x.PageCount },
                                         where: x => x.PageCount > 400,
                                         order: x => x.PublishedDate,
                                         take: 4,
                                         skip: 0);

foreach (var i in selectCustom)
    Console.WriteLine(string.Format("{0, -60} {1, 15}\n", i.Title, i.PageCount));

Operador Select

Nos permite seleccionar campos específicos de un objeto, para mejorar el rendimiento y ahorrar espacio en memoria.

public List<Book> getTop3FromBooks(IEnumerable<Book> books){
    return books.Take(3).Select(p=> new Book(){Title = p.Title, PageCount = p.PageCount}).ToList();
}

public class BookDTO{
    public string Title {get;set;}
    public int PageCount {get;set;}
}
public List<BookDTO> getTop3FromBooksQuery(IEnumerable<Book> books){
    return (from b in books select new BookDTO{Title = b.Title, PageCount=b.PageCount}).Take(3).ToList();
}
public class Item
{
 public string Title { get; set; }
 public int PageCount { get; set; }
}

public IEnumerable<Item> seleccionarTituloYNumPagDeLosPrimerosTresLibros()
    {
       return booksCollection.Take(3).Select(x=> new Item() {Title =x.Title, PageCount=x.PageCount});
    }
```c# public IEnumerable<Book> TresPrimerosLibros() { return librosCollection.Take(3) .Select(p=> new Book() { Title = p.Title, PCount = p.PageCount }) } ```
```js public IEnumerable<object> TituloNumeroPagdeTresPrimerosLibros() { var libros = librosCollection .OrderByDescending(p => p.PageCount) .Take(3) .Select(p => new { Title = p.Title, Paginas= p.PageCount }); foreach (var libro in libros) { Console.WriteLine($"Título: {libro.Title}, Fecha de Publicación: {libro.Paginas}"); } return libros ; } ```

public IEnumerable<Book> TresPrimerosLibros()
{
return (from l in librosColletion select new Book{ Title = l.Title , PageCount= l.PageCount}).Take(3) ;
}

Lo conseguí!:

Item.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Curso_Linq
{
    internal class Item
    {
        public string? Title { get; set; }
        public int PageCount { get; set; }
    }
}

al final del LinqQueries.cs:

internal class LinqQueriesItems
    {

        private List<Item> items = new List<Item>();
        public LinqQueriesItems()
        {
            using (StreamReader reader = new StreamReader("books.json"))
            {
                string json = reader.ReadToEnd();
                this.items = System.Text.Json.JsonSerializer.Deserialize<List<Item>>(json, new System.Text.Json.JsonSerializerOptions() { PropertyNameCaseInsensitive = true });
            }
        }

        public IEnumerable<Item> PrimerosXLibros(int quantity)
        {
            return items.Take(quantity)
                .Select(book => new Item()
                {
                    Title = book.Title,
                    PageCount = book.PageCount
                });
        }
    }

en Program.cs:

LinqQueriesItems items = new();

string formatoTextoItem = "{0, -60} {1, 15}";

        void ImprimirItems(IEnumerable<Item> listaDeItems)
        {
            Console.WriteLine($"{formatoTextoItem}\n", "Titulo", "N. Paginas");
            foreach (var book in listaDeItems)
            {
                Console.WriteLine($"{formatoTextoItem}", book.Title, book.PageCount);
            }
        }

//* Primeros X libros filtadros con Select
        ImprimirItems(items.PrimerosXLibros(3));

Esta parece una excelente oportunidad para aplicar el patrón creacional Builder