LINQ to Objects permite a los desarrolladores hacer consultas sobre una colección de objetos con una sintaxis igual a la que podríamos utilizar para realizar una consulta sobre una base de datos con SQL.
Normalmente para mostrar el contenido de una colección utilizamos el bucle “foreach” pero sin poder usar ningún filtro para hacer una selección de los datos que queremos mostrar pero ya con una selección de datos echa.
Ahora, nosotros podemos consultar con LINQ sobre una colección que tenga implementada la interface “IEnumerable”, que por defecto la tendrán todos menos las genéricas y personalizadas que se lo deberemos aplicar nosotros.
Veamos un ejemplo, primero nos creamos una clase muy sencilla:
public class Students
{
public string Nombre { get; set; }
public string Apellido { get; set; }
public int Edad { get; set; }
}
Y luego en el Main creamos una lista a semejanza de esta clase:
static void Main(string[] args)
{
List<Students> std = new List<Students> {
new Students {Nombre= “Jose”,Apellido=“Manuel”,Edad=22},
new Students {Nombre=“Jose”, Apellido=“Anthon”, Edad=26},
new Students {Nombre=“Ester”,Apellido=“Garcia”, Edad=27},
new Students {Nombre=“Ruben”,Apellido=“Smith”,Edad=34},
new Students {Nombre=“David”,Apellido=“Macrch”,Edad=31},
new Students {Nombre=“Jordi”,Apellido=“Garcia”,Edad=27}
};
Y ahora queremos mostrar por pantalla los estudiantes que tengan 27 años de edad:
var response = from s in std where s.Edad == 27 select s;
foreach (Students student in response)
{
Console.WriteLine(student.Nombre + ” “ + student.Apellido + ” “ + student.Edad);
}
Console.ReadLine();
}
Fácil verdad, vamos a profundizar más y a explicaros palabra por palabra. Así a primer golpe de vista lo primero que os viene a la vista es la palabra var. Nuevo tipo anónimo definir tipos “inline” sin tener que especificar ningún tipo de datos, no os asustéis, esta palabra no funciona como el “Object” es todo lo contrario a ella, esta nueva palabra siempre hace referencia a una variable de un tipo fuertemente tipado. En vez de obligarnos a definir explícitamente el tipo de variable, var se encarga de decirle al compilador que detecte el tipo de datos de la variable.
Esto significa que si nosotros hacemos algo parecido a esto var nombrev = “Francesc”; el compilador inferirá el tipo de variables basándose en el tipo de datos de la asignación inicial, en este caso un string. Por lo tanto si nosotros hacemos lo mismo pero indicando el tipo de datos string nombret = “Francesc”; el compilador genera el mismo código IL para ambos casos. Leído esto tenéis que saber que esta nueva palabra SIEMPRE debe estar inicializada, precisamente porque si no IL no puede inferir el tipo de datos que tenga asignada la inicialización en la primera declaración de un tipo var.
De hecho el compilador no se dará ni cuenta de que esta palabra está siendo usada porque para él no hay diferencia entre las dos declaraciones anteriores.
Esto es lo que entiende el CLR del Framework, como veréis, crea lo mismo (es código IL):
[1] string nombrev,
[2] string nombret,
[3] object mytesti,
Las siguientes palabras nos deberían sonar un poco si habéis trabajado mínimamente con SQL. Con from estamos declarando una variable que accederá a las propiedades o “campos” de nuestra lista (como un foreach). Luego con in le decimos que lista y con where le hacemos el flitro. Como la variable s esta creada a semejanza de la lista std al escribir la variable y pulsar “.” el intellisense ya nos muestra las propiedades con las que podemos trabajar. Para finalizar, y después de la condición no al principio como SQL, le decimos que en response ponga s, es decir select.
Luego hacemos lo de siempre, un foreach dentro de la respuesta, en este caso de la variable response.
Recordar que para ejecutar este código debe hacerse en VS2008 y con el Framework 3.5. Si tenéis dudas preguntarme que os respondo y si quereís el fuente sin problemas también. A poder ser en comentarios que así damos participación al blog!
6 respuestas hasta el momento ↓
Raúl // Junio 24, 2008 a 2:26 pm |
Muchas gracias por el articulo…
Me estoy iniciando en esto del mundo del .NET con C#, y bueno que te puedo decir la explicación esta de lujo y me saco de algunos apuros, me hubiera gustado encontrar tambien el “Linq to SQL” y el “Linq to XML”, pero no se puede tener todo en esta vida verdad
, por lo pronto me despido continuo investigando los otros dos tipos de Linq, gracias una vez más hasta la próxima.
Tu amigo: Raúl.
fjaumot // Junio 24, 2008 a 10:56 pm |
Hola Raúl,
Gracias por tus comentarios y espero que te sirva mi explicación. En breve subire el post “LINQ to XML” así como “LINQ to SQL”; los estoy preparando pero lleva tiempo prepararlos bien
Gracias, y espero que mi sigás leyendo!
Daniel // Agosto 5, 2008 a 3:09 pm |
La explicacion esta buenisima , como puedeo mostrarlo en un datagridview?
hice una consulta a un Arraylist y me salio exelente pero ahora esa consulta deseo mostrarlo en un datagridview. Gracias
fjaumot // Agosto 5, 2008 a 3:23 pm |
Hola! Gracias por el comentario Daniel!
Bien, te comento como creo que se puede hacer. La consulta LINQ te devuelve un objeto tipado gracias a var; en este caso es response. En esta nueva versión tienes LinqDataSource al igual que ObjectDataSource o bien SqlDataSource.
Utiliza LinqDataSource para asignar al datasource e tu DataGridView la variable response.
Ya me comentas que tal,
Gracias!
Andrés Felipe Tabares // Agosto 14, 2008 a 7:05 pm |
Esta muy buena tu explicación, había visto unas 2 pero nada claras para mi. Quedo a la espera de la explicación de Sql y Xml.
Muchas Gracias…. desde medellín-colombia.
Emiliano // Agosto 21, 2008 a 2:13 am |
Me gustaria saber si existe la posibilidad de armar un consulta en base a parametros, por ejemplo: que yo tenga como parametro el nombre de un atributo del objeto que estoy recorriendo y ordenarlo en base a ese mismo, un seudo codigo seria.
var resultado = from n in xxx orderby n.’parametro’ select n;
(donde parametro va a representar el orden que le quiero dar)