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:
_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
Buen aporte, a veces me cuesta leer aportes complejos o muy extensos, pero este ha valido la pena. 👏
definición IEnumerable
Gracias Heroe
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:
publicIEnumerable<Book>BooksInActionAndMoreThan250Pages(){// Extension methodreturn 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;}
publicIEnumerable<Book>LibrosMasDe250Paginas(string method, int pages, string title){if(method is "method"){return _booksCollection.Where(x=> x.PageCount> pages && x.Title.Contains(title));}elseif(method is "query"){returnfrom b in _booksCollection
where b.PageCount> pages && b.Title.Contains(title) select b;}else{returnEnumerable.Empty<Book>();}}
Me encantaría un curso como este para manejar colecciones en Java, sería increible.
Mi solución
Program.cs
IEnumerable<Book> tempBooks = queries.LibrosConXMasPaginas(250);PrintValues(queries
.LibrosQueContieneXPalabraEnTitulo("in Action", tempBooks));```**LinqQueries:**
```js
publicIEnumerable<Book>LibrosConXMasPaginas(int maxPages,List<Book> libros =null){// we making the program scalable if(libros ==null){ libros = librosCollection;}// extension methodreturn libros.Where(p=> p.PageCount> maxPages);// query expression//return from l in libros where l.PageCount > maxPages select l;}publicIEnumerable<Book>LibrosQueContieneXPalabraEnTitulo(string palabra,IEnumerable<Book> libros =null){// we making the program scalable if(libros ==null){ libros = librosCollection;}// extension methodreturn 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"
Quizas un
ToLower()
para manejar el "iN actioN" en caso de que exista.
Esta es mi forma de realizar el reto:
publicIEnumerable<Book>booksWithMoreThan500Pages(){//EXTENSION METHOD//return booksCollection.Where(book => book.PageCount > 500);//QUERY SYNTAXreturnfrom k in booksCollection where k.PageCount>500&& k.Title.Contains("in Action") select k;}
Lo cual me devuelve en consola:
Title N. Paginas Año de Publicacion
Android in Action, Second Edition 592 14/01/2011
Grails in Action 520 1/05/2009
OSGi in Action 576 6/04/2011
GWT in Action 632 1/06/2007
Comparto una versión con parámetros
public IEnumerable<Book> GetBooksByPagesAndTitle(int pages, string filterTitle)
return from l in librosCollection where l.PublishedDate.Year > 2000 select l;
}
buen dia
como se puede hacer un where tipo Condicion ? Expresion1 : Expresion2; en linq ?
Puedes dar un poco más de contexto? la idea del where es filtrar la información y apoyarnos de los operadores (y/o) && y || para combinar las condiciones
Qué tal, quise hacer un nuevo método con Query Expression para mostrar los libros cuyo autor contiene a "Robi" pero n otrae resultados. Supongo que es debido a que se maneja diferente el filtrar un arreglo de string. Mi query es el siguiente:
return from l in librosCollection where l.Authors.Contains("Robi") select l;
Pregunta Authors es una colección de strings? por que sino estarias haciendo mal la comparación, también revisa por fa si estas respetando mayusculas y minusculas. en general se ve bien.
Así es, la declaración es la siguiente:
public string[] Authors { get; set; }
Respecto a las mayúsculas y minúsculas no hay errores de compilación ni en tiempo de ejecución.
Tarda lo mismo la consulta si es una expresion query o un extension method?
Si, en teoria no tiene gran diferencia la traducción a SQL es practicamente la misma
Esta es la propuesta de mejora que propongo sobre los métodos, de paso devuelve la data ordenada: