2011-07-26 11 views
6

Necesito buscar en una tabla dblinq para que la función devuelva la lista de filas si alguno de los campos coincide con la entrada de búsqueda.¿Cómo buscar cualquier propiedad desde una tabla con linq?

Es más similar a la búsqueda de Google donde se busca con cualquier palabra clave y se muestra la lista de documentos que coinciden.

Utilicé la reflexión para esta técnica. ¿Puedes verificar si este método es correcto o hay algún método simple para lograrlo?

Tengo todas las propiedades de las filas de la tabla dblinq y las comparé si es tipo de cadena y luego compruebo el valor.

El código que he utilizado

public static List<Contacts> SearchContact(string searchText) 
    { 

     List<Contacts> list = new List<Contacts>(); 
     try 
     { 
      var rows= from p in context.tblContacts select p; 

      foreach (var contact in rows) 
      { 
       Type type = contact.GetType(); 
       Type typesearch = searchText.GetType(); 
       PropertyInfo[] properties = type.GetProperties(); 
       foreach (PropertyInfo pro in properties) 
       { 
        if (pro.PropertyType == typesearch) 
        { 

         var value = pro.GetValue(contact, null); 
         string val = value as string; 

          if (val != null && val == searchText) 
          { 
           list.Add(contact); 
           break; 
          } 

        } 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
     } 
     return list; 
    } 

PD: Me estoy haciendo la producción esperada de este método, pero me gustaría saber si tengo alguna forma alternativa también.

Respuesta

2

que no tienen Visual Studio con la mano para probarlo pero esto debería funcionar, también:

var contactProperties = typeof(Contact).GetProperties() 
           .Where(x => x.PropertyType == typeof(string)) 
           .ToArray(); 

from contact in context.tblContacts 
from property in contactProperties 
let value = property.GetValue(contact, null) as string 
where value == searchText 
select contact 

me gustaría tener las propiedades de una sola vez, porque es la misma en todo momento.

En su pregunta si desea utilizar la reflexión o no ... depende. Si su tipo Contact tiene solo unas pocas (2-5) propiedades de cadena, implementaría este método a mano en lugar de usar el reflejo. Puede ser un poco tedioso, pero paga en legibilidad, velocidad (sin embargo, no debería ser una diferencia notable) y puede controlar qué propiedades se comparan (tal vez su contacto contiene una propiedad de cadena que no debe buscarse).

Si planea extender/cambiar el tipo Contact o tiene que verificar una gran parte de las propiedades me gustaría ir con la reflexión.

0
public static List<Contacts> SearchContact(string searchText) 
{ 
     return (from contact in context.tblContacts 
      let type = contact.GetType() 
      let typesearch = searchText.GetType() 
      let properties = type.GetProperties() 
      where (from pro in properties 
        where pro.PropertyType == typesearch 
        select pro.GetValue(contact, null) 
        into value 
        select value as string).Any(val => val != null && val == searchText) 
      select contact).ToList(); 
} 

EDIT: la parte de control de excepciones no se encuentra, pero es bastante fácil de incluir.

+0

Gracias Bala, por lo que de cualquier manera debería usar el reflejo para este derecho? – Coder323

Cuestiones relacionadas