en

Sitio de encuentro para los desarrolladores .NET

Mucio Zarate

mayo 2008 - Artículos

  • Ejemplo de LINQ en Windows Mobile para buscar contactos de Outlook

    Al estar desarrollando una aplicación móvil que incluye la búsqueda o filtrado de contactos de Outlook, encuentro que aunque no esta disponible todo el LINQ en Windows Mobile, podemos aprovechar lo que tenemos para simplificar nuestro código y ahorrar una gran cantidad de tiempo con LINQ.

    ok, para empezar nuestro objetivo es tener una forma donde muestre únicamente los contactos que tienen registrado un número celular y que el nombre inicie con algunas letras, por ejemplo A,B o C, así que lo primero que hacemos es agregar una referencia a Microsoft.WindowsMobile.PocketOutlook.dll  parar trabajar con la clase OutlookSession.

    Buscando las propiedades de la clase encontramos que podemos buscar un contacto usando el método find de outlookSession.Contacts.Items y que este nos pide un objeto del tipo PropertyDescriptor; un ejemplo de esto sería el código que sigue que busca un contacto cuyo nombre sea igual a "Alejandro".

     

          OutlookSession outlookSession = new OutlookSession();

                PropertyDescriptor pdContact =TypeDescriptor.GetProperties(typeof(Contact))["FirstName"];

                int index = outlookSession.Contacts.Items.Find(pdContact, "Alejandro");

     

                if (index != -1)

                {

                    //Encontramos un contacto

                    Contact contact = outlookSession.Contacts.Items[index];

                }

    Sin embargo, estamos muy lejos de nuestro objetivo ya que esto solo regresa un contacto y no hemos filtrado los contactos que no tienen celular. Buscando las propiedades de la clase vemos que disponemos del método outlookSessionContacts.Items.Restrict(string query) el cual nos regresa una colección de contactos y al cual tenemos que pasarle un string de la consulta o filtro que deseamos realizar. Sin embargo, revisando la documentación no queda claro como construir la consulta que necesitamos ya que únicamente soporta los operadores "<, <=, >, >=, =, <>".

    Es aquí donde con la ayuda de LINQ podemos simplificar nuestro desarrollo, ya que si observamos la definición de outlookSession.Contacts.Items es una colección de contactos la cual implementa la interfaz IEnumerable, con lo que podemos realizar nuestro filtro usando LINQ como lo muestra el siguiente código de ejemplo:

     

        //Busca los contactos cuyo nombre comienze con A,B o C y tenga registrado un número celular

        var contacts = from Contact c in outlookSession.Contacts.Items

                    where String.IsNullOrEmpty(c.MobileTelephoneNumber) == false &&

                        (c.FirstName.ToUpper().StartsWith("A")

                        || c.FirstName.ToUpper().StartsWith("B")

                        || c.FirstName.ToUpper().StartsWith("C"))

                    orderby c.FirstName

                    select new { c.FirstName, c.LastName, c.MobileTelephoneNumber };

     

        //Despliega los contactos encontrados

        foreach (var c in contacts)

        {

            item = new ListViewItem(new string[] { c.FirstName + " " + c.LastName, c.MobileTelephoneNumber });

            listView1.Items.Add(item);

        }

     

    Que ventajas tenemos al usar LINQ? para empezar disponemos de la ayuda de IntelliSense para construir la consulta, usamos las métodos ToUpper().StartsWith()  para buscar fácilmente los contactos que inician con una determinada letra y usamos String.IsNullOrEmpty() para filtrar los contactos que no tienen celular, todo esto un código fácil de modificar y entendible por cualquier persona que conozca .NET.

     

    ¿Que les parece?

Más artículos
Comunidad Guadalajara .NET 2007
Ofrecido por Community Server (Non-Commercial Edition)