No tienes acceso a esta clase

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

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

12 Días
14 Hrs
43 Min
54 Seg

Usando el operador Where

9/26
Recursos

Aportes 27

Preguntas 4

Ordenar por:

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

1. Como aporte, se modificó un poco el código que traía de clase anterior, agregue el método de GetCustomFilter utilizando el delegado como parámetro Func<Book, bool> para poder filtrar a conveniencia desde donde se invoque una instancia de esta clase LinqQueries, como se aprecia en la imagen 2. Combinando esta forma con delegados y Linq se saca un poder increíble al momento de por ejemplo filtrar:

LinqQueries queries = new LinqQueries();
Func<Book, bool> filtro = x => x.PublishedDate.Year >= 2000 && x.PageCount > 600;
var filtrado = queries.GetCustomFilter(filtro);

_Y ahí mismo se puede concatenar más condiciones dando un dinamismo en el filtrado que de otra manera es mas complicado. _

2. También se modificó la clase de Book.cs sobrescribiendo el método ToString() para devolver el string parseado que estamos mostrando por consola para ver el Titulo, páginas y fecha publicación y el signo de pregunta al final del tipo de cada propiedad es para dejar la propiedad de tipo Nullable o que acepta valores null. En la sección o archivo de Program.cs solo de crea la instancia nueva, se crea la variable filtro que tiene la definición de la expresión de nuestro filtro (año publicación >= 2000 y además que las páginas sean mayor a 600) Lo importante de esta parte es que podemos desde la instancia aplicar el filtro que se quiera, y no depender de la clase con la implementacion.

_3. Aqui el resultado _

4. y como ya es costumbre la imagen completa

definición IEnumerable

Documentación oficial de LINQ

en Microsoft

Si hicieron colocaron como nullable las propiedades string de libros les aparecerá una advertencia en las query. Para solucionarlo usé el operador (??) de esta manera:

public IEnumerable<Book> BooksInActionAndMoreThan250Pages()
    {
        // Extension method
         return collectionBook.Where(book => book.PageCount > 250 && (book.Title ?? String.Empty).Contains("in Action"));

        // Query Expression
        //return from l in collectionBook where l.PageCount > 250 && (l.Title ?? String.Empty).Contains("in Action") select l;
    }

Asi quedo mi Query

public IEnumerable<Book> LibrosDespues2000 => libros.Where(libro => libro.PublishedDate.Year > 2000);
public IEnumerable<Book> LibrosMasDe250Paginas(string method, int pages, string title)
    {
        if (method is "method")
        {
            return _booksCollection.Where(x => x.PageCount > pages && x.Title.Contains(title));
        }
        else if (method is "query")
        {
            return from b in _booksCollection
                   where b.PageCount > pages && b.Title.Contains(title)
                   select b;
        }
        else
        {
            return Enumerable.Empty<Book>();
        }
    }
Mi solución **Program.cs** ```js IEnumerable<Book> tempBooks = queries.LibrosConXMasPaginas(250); PrintValues(queries .LibrosQueContieneXPalabraEnTitulo("in Action", tempBooks)); ```**LinqQueries:** ```js public IEnumerable<Book> LibrosConXMasPaginas(int maxPages, List<Book> libros = null) { // we making the program scalable if(libros == null) { libros = librosCollection; } // extension method return libros.Where(p => p.PageCount > maxPages); // query expression //return from l in libros where l.PageCount > maxPages select l; } public IEnumerable<Book> LibrosQueContieneXPalabraEnTitulo(string palabra, IEnumerable<Book> libros = null) { // we making the program scalable if (libros == null) { libros = librosCollection; } // extension method return libros.Where(p => p.Title.Contains($"{palabra}")); // query expression //return from l in libros where l.Title.Contains($"{palabra}") select l; } } ```

Reto 2: Filtro paginas > 250 y titulo contiene “in Action”

Mi solución al reto: ![](https://static.platzi.com/media/user_upload/image-9b23e07d-45f9-410e-942d-917a85a99327.jpg)
Me encantaría un curso como este para manejar colecciones en Java, sería increible.
Esta fue mi solución al intentar resolverlo por mi cuenta =) `var LibrosDespues2000 = queries.TodaLaColeccion().Where(l => l.PublishedDate.Year >= 2000).ToList();` `LibrosDespues2000.ForEach(l => Console.WriteLine(l.PublishedDate.Year));`
```c# //Extension method return BooksCollections.Where(p => p.PageCount > 250 && p.Title.Contains("in Action")); //Query expression var query = from p in BooksCollections where p.PageCount > 250 && p.Title.Contains("in Action") select p; return query; ```
¿Qué extensión estás usando para que te aparescan las recomendaciones de Linq en el Visual Studio Code?
```js ImprimierValores(queries.LibrosPorPaginasYTitulo(250, "in action")); public IEnumerable<Book> LibrosPorPaginasYTitulo(int pagina, string titulo) { // querys expresion return from l in librosColeccion where l.PageCount > pagina && l.Title.ToUpper().Contains(titulo.ToUpper()) select l; } ```  public IEnumerable\<Book> LibrosPorPaginasYTitulo(int pagina, string titulo)  {       // querys expresion    return from l in librosColeccion where l.PageCount > pagina && l.Title.ToUpper().Contains(titulo.ToUpper()) select l;  }
```js public IEnumerable<Book> LibrosDespuesDelAnio(DateTime fecha) { //return librosColeccion.Where(p => p.PublishedDate.Year > fecha.Year); // querys expresion return from l in librosColeccion where l.PublishedDate.Year > fecha.Year select l; } } ```
En Program.csusing System;public class LinqQueries{    private List\<Book> librosColletion = new List\<Book>();    public LinqQueries()    {        using(StreamReader reader = new StreamReader("books.json"))        {            string json = reader.ReadToEnd();            this.librosColletion = System.Text.Json.JsonSerializer.Deserialize\<List\<Book>>(json, new System.Text.Json.JsonSerializerOptions(){PropertyNameCaseInsensitive = true})!;        }    }     public IEnumerable\<Book> TodaLaColeccion()    {        return librosColletion;    }     public IEnumerable\<Book> LibrosDespuesDel2000()    {        //*Extension method*        //*return librosColletion.Where(p => p.PublishedDate.Year > 2000);*         //*query method*        return from l in librosColletion where l.PublishedDate.Year > 2000 select l;    }     public IEnumerable\<Book> LibrosFiltroPaginas()    {        return from p in librosColletion where p.PageCount >= 250 select p;    }     public IEnumerable\<Book> LibrosFiltroNombres()    {        return from n in librosColletion where n.Title.Contains("Action") select n;    } }   LinqQueries queries = new LinqQueries();LinqQueries queriesPaginas = new LinqQueries(); //*ImprimirValores(queries.TodaLaColeccion());* ImprimirValores(queries.LibrosDespuesDel2000()); ImprimirValores(queries.LibrosFiltroPaginas()); ImprimirValores(queries.LibrosFiltroNombres()); void ImprimirValores(IEnumerable\<Book> listadelibros) {    Console.WriteLine("{0,-60} {1,15} {2,15}\n", "Titulo", "N. Paginas","Fecha de publicacion");    foreach(var item in listadelibros)    {        Console.WriteLine("{0,-70} {1,15} {2,15}", item.Title, item.PageCount, item.PublishedDate.ToShortDateString());    }} ```js using System; LinqQueries queries = new LinqQueries(); LinqQueries queriesPaginas = new LinqQueries(); //ImprimirValores(queries.TodaLaColeccion()); ImprimirValores(queries.LibrosDespuesDel2000()); ImprimirValores(queries.LibrosFiltroPaginas()); ImprimirValores(queries.LibrosFiltroNombres()); void ImprimirValores(IEnumerable<Book> listadelibros) { Console.WriteLine("{0,-60} {1,15} {2,15}\n", "Titulo", "N. Paginas","Fecha de publicacion"); foreach(var item in listadelibros) { Console.WriteLine("{0,-70} {1,15} {2,15}", item.Title, item.PageCount, item.PublishedDate.ToShortDateString()); } } ``` y en linqQueries.cs ```js public class LinqQueries { private List<Book> librosColletion = new List<Book>(); public LinqQueries() { using(StreamReader reader = new StreamReader("books.json")) { string json = reader.ReadToEnd(); this.librosColletion = System.Text.Json.JsonSerializer.Deserialize<List<Book>>(json, new System.Text.Json.JsonSerializerOptions(){PropertyNameCaseInsensitive = true})!; } } public IEnumerable<Book> TodaLaColeccion() { return librosColletion; } public IEnumerable<Book> LibrosDespuesDel2000() { //Extension method //return librosColletion.Where(p => p.PublishedDate.Year > 2000); //query method return from l in librosColletion where l.PublishedDate.Year > 2000 select l; } public IEnumerable<Book> LibrosFiltroPaginas() { return from p in librosColletion where p.PageCount >= 250 select p; } public IEnumerable<Book> LibrosFiltroNombres() { return from n in librosColletion where n.Title.Contains("Action") select n; } } ```
Mi solucion al segundo reto: Lo que contiene el archivo Program para imprimir los resultados: ```js //Libros despues del 2000: ShowAllData(queries.BooksAfter2000()); //Libros que contengan la palabra Action en el titulo: ShowAllData(queries.BooksContainAction()); ```
Mi solucion al segundo reto: (El primero lo agrego el profesor y ademas lo copie por que no sabia donde hacerlo) ```c# public IEnumerable<Book> MoreOf250Pages() { return CollectionBooks.Where(p => p.PageCount > 250); } public IEnumerable<Book> BookContainAction() { return CollecionBooks.Where(x => x.Title.Contains("Action")); } ```

Hecho desde Program.cs

Reto 2: Filtro paginas > 250 y titulo contiene “in Action”

PrintBooks(books.GetBooks().Where(book => book.PageCount > 250 && book.Title.Contains("in Action")));
 public List<Book> FilterBooks(int year, int pages, string textToSearch)
    {
        var filteredList = collectionBooks.ToList().AsQueryable();

        if (year > 0)
        {
            filteredList = filteredList.Where(book => book.publishedDate.Year > year);
        }

        if (pages > 0)
        {
            filteredList = filteredList.Where(book => book.pageCount > pages);
        }

        if (textToSearch != "")
        {
            filteredList = filteredList.Where(book => book.title.Contains(textToSearch));
        }

        return filteredList.ToList();
    }```

yo elegí crear mi propio metodo de filtrado por paginas y texto

public IEnumerable<Book> GetBookByPageAndByTitle(int page, string title)
    {
        //extension method
        //return CollectionBook.FindAll(book => book.PageCount > page && book.Title.Contains(title));

        //linq query
            return from book in CollectionBook where (book.PageCount ?? 0) > page && (book.Title?.Contains(title) ?? false) select book;

    }

Reto de la clase antes de ver el vídeo (Y sí es muy similar a SQL):

public IEnumerable<Book> MasDe200PaginasYTituloContieneAction()
        {
            return from book in librosCollection
                        where book.PageCount > 250
                        && book.Title.Contains("in Action")
                        select book;
        }

Aca mi solucion

    public IEnumerable<Book> BooksWithMoreThan250Pages()
    {
        // return booksCollection.Where(b => b.PageCount > 250 && b.Title.Contains("action"));

        return from b in booksCollection where b.PageCount > 250 && b.Title.Contains("action") select b;
    }```

Definitivamente enamorado de Linq

 public IEnumerable<Book> TodaLaColeccion()
        {
            // extension method
            // return this.librosCollection.OrderBy(book => book.Title);
            // query method
            return from book in this.librosCollection
                   orderby book.Title
                   select book;
        }

        public IEnumerable<Book> LibrosPublicadosDespuesDel2000()
        {
            // extension method
            // return this.librosCollection.Where(book => book.PublishedDate.Year > 2000);
            // query method
            return from book in this.librosCollection
                   where book.PublishedDate.Year > 2000
                   select book;
        }

        public IEnumerable<Book> LibrosConMasDe250Paginas()
        {
            // extension method
            // return this.librosCollection.Where(book => book.PageCount > 250 && book.Title.Contains("in Action"));
            // query method
            return from book in this.librosCollection
                   where book.PageCount > 250 && book.Title.Contains("in Action")
                   select book;
        }
// Reto 1
public IEnumerable<Book> LibrosDespuesDeCiertoAnio(string method, int year)
    {
        if (method is "method")
        {
            // Extension method
            return _booksCollection.Where(x => x.PublishedDate.Year > year).OrderByDescending(x => x.PublishedDate);
        }
        else if (method is "query")
        {
            // Query expresion
            return from b in _booksCollection
                where b.PublishedDate.Year > year
                orderby b.PublishedDate descending
                select b;
        }
        else 
        {
            return Enumerable.Empty<Book>();
        }
    }

Cordial saludo Miguel. Sería muy bueno que en los próximos videos que hagas uses parámetros al crear los métodos. Muy bueno el curso. Gracias