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?