No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Usando el operador Where

9/26
Recursos

Aportes 23

Preguntas 3

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

Hola, forastero si has llegado hasta aqui quiere decir que vas enserio, te regalo mis apuntes, a mi me sirvieron, a lo mejor te sierven a ti.
https://drive.google.com/file/d/1IQzfpYKqimrTeMynISSUlYAQlOzENy2d/view?usp=sharing

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

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>();
        }
    }

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);
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 鈥渋n Action鈥

```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 鈥渋n 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