Obtener Datos Filtrados Usando Linq

martes, 19 de junio de 2012

Siempre que trabajamos con registros o colecciones de datos tenemos la necesidad de hacer búsquedas usando algun filtro para obtener los datos que cumplan ciertas condiciones, pues bien ahora veremos como hacer esto utilizando LINQ(tecnología que estoy aprendiendo).

Para este ejemplo usare una lista de tipo clase(personas) para representar los registros y luego obtendremos los registros que sean iguales o mayores a la edad que el usuario especifique usando linq.

El ejemplo esta desarrollado con C# Y VB.Net al final encontraran los proyectos para descargar

Nuestro formulario tendrá el siguiente diseño.

Diseño


Empezaremos agregando una clase a nuestro proyecto Personas.cs Personas.vb y tendrá el siguiente código.

public class Personas
{
private string nombre;
private string apellido;
private int edad;

//propiedades
public string Nombre
{
get { return nombre;}
set { nombre = value; }
}

public string Apellido
{
get { return apellido; }
set { apellido = value; }
}

public int Edad
{
get { return edad; }
set { edad = value; }
}

//constructor
public Personas(string nombre, string apellido, int edad)
{
this.nombre = nombre;
this.apellido = apellido;
this.edad = edad;
}

//registros
public static List<Personas> Registros()
{
List<Personas> personas = new List<Personas>();

personas.Add(new Personas("Cristian","Torres",20));
personas.Add(new Personas("Jose", "Alfaro", 18));
personas.Add(new Personas("Briseyda", "Flores", 12));
personas.Add(new Personas("Diana", "Turcios", 17));
personas.Add(new Personas("Miguel", "Fernadez", 40));
personas.Add(new Personas("Pedro", "Perez", 11));
personas.Add(new Personas("Nicole", "Garcia", 20));

return personas;
}
}


Public Class Personas
Private _nombre As String
Private _apellido As String
Private _edad As Integer

'propiedades
Public Property Nombre() As String
Get
Return _nombre
End Get
Set(ByVal value As String)
_nombre = value
End Set
End Property
Public Property Apellido() As String
Get
Return _apellido
End Get
Set(ByVal value As String)
_apellido = value
End Set
End Property
Public Property Edad() As Integer
Get
Return _edad
End Get
Set(ByVal value As Integer)
_edad = value
End Set
End Property
'constructor
Public Sub New(ByVal nombre As String, ByVal apellido As String, ByVal edad As Integer)
_nombre = nombre
_apellido = apellido
_edad = edad
End Sub
'registros
Public Shared Function Registros() As List(Of Personas)
Dim personas As New List(Of Personas)()

personas.Add(New Personas("Cristian", "Torres", 20))
personas.Add(New Personas("Jose", "Alfaro", 18))
personas.Add(New Personas("Briseyda", "Flores", 12))
personas.Add(New Personas("Diana", "Turcios", 17))
personas.Add(New Personas("Miguel", "Fernadez", 40))
personas.Add(New Personas("Pedro", "Perez", 11))
personas.Add(New Personas("Nicole", "Garcia", 20))

Return personas
End Function

End Class

El código es sencillo y fácil de entender lo único que se hace es crear una lista de registros de tipo clase Pesona que son los que utilizaremos para hacer nuestra consulta.

Ahora en nuestro en nuestro formulario tendremos el siguiente código.

public Form1()
{
InitializeComponent();
CargarList();
}

List<Personas> personas;
public void CargarList()
{
personas = Personas.Registros();
}

private void Form1_Load(object sender, EventArgs e)
{
dataGridView1.DataSource = Personas.Registros();

}

private void button1_Click(object sender, EventArgs e)
{
List<Personas> resultados = new List<Personas>();

int edad = Convert.ToInt32(textBox1.Text);

var query = personas.Where(p => p.Edad >= edad);//obtener datos sean mayores e iguales a la edad digitada

foreach (var result in query)
{
resultados.Add(result);
}

dataGridView1.DataSource = resultados;
}


Public Sub New()
InitializeComponent()
CargarList()
End Sub
Dim pers As List(Of Personas)
Public Sub CargarList()
pers = Personas.Registros()
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
DataGridView1.DataSource = Personas.Registros()
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim resultados As New List(Of Personas)

Dim edad As Integer = Convert.ToInt32(TextBox1.Text)

Dim query = pers.Where(Function(p) p.Edad >= edad) 'obtener datos sean mayores a la edad digitada

For Each result In query
resultados.Add(result)
Next

DataGridView1.DataSource = resultados

End Sub

En el código lo que hacemos primeramente es cargar los datos de la lista en el constructor del formulario.Luego en el evento load del formulario cargamos todos los datos de lista en el datagriedview.
Y para hacer el filtro de los datos en el evento click del botón puede verse que lo primero que hacemos es crear una lista de tipo personas llamada resultados que sera la que tendrá todos los registros que cumplan con el filtro que aremos que este caso sera por la edad, hacemos el filtro de nuestros datos usando linq y expresion lambda de la siguiente manera.
var query = personas.Where(p => p.Edad >= edad);
Dim query = pers.Where(Function(p) p.Edad >= edad)
Lo que estamos diciendo en esa linea es que obtendremos los registros de las personas donde la edad sea mayor o igual al dato introducido en el textbox.
Y por ultimo lo que hacemos en el código es llenar la lista resultados con los datos obtenidos de nuestra consulta.

Resultado 
 
 Resultado

0 comentarios:

Publicar un comentario en la entrada

Nota: solo los miembros de este blog pueden publicar comentarios.