2011-07-26 7 views
6

Muszę przeszukać tabelę dblinq, aby funkcja zwróciła listę wierszy, jeśli którekolwiek z pól pasuje do danych wejściowych wyszukiwania.Jak przeszukać dowolną nieruchomość z tabeli z linq?

Jest to bardziej podobne do wyszukiwania google, w którym wyszukiwane są dowolne słowa kluczowe i wyświetlana jest lista pasujących dokumentów.

Użyłem refleksji dla tej techniki. Czy możesz sprawdzić, czy ta metoda jest poprawna, czy jest jakaś prosta metoda, aby to osiągnąć?

Mam wszystkie właściwości wierszy tabeli dblinq i porównałem, jeśli jest to typ łańcucha, a następnie sprawdziłem wartość.

Kod Użyłem

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; 
    } 

PS: jestem coraz oczekiwane wyjście z tej metody, ale chciałbym wiedzieć, czy mam jakiś alternatywny sposób zbyt.

Odpowiedz

2

nie mam Visual Studio ręcznie, aby go przetestować, ale to powinno działać też:

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 

chciałbym uzyskać właściwości tylko raz, bo to samo za każdym razem.

Na twoje pytanie, czy użyć refleksji czy nie ... to zależy. Jeśli Twój typ Contact ma tylko kilka (2-5) właściwości łańcuchów, ręcznie zaimplementowałbym tę metodę, zamiast używać odbicia. Może to być trochę uciążliwe, ale opłacalne pod względem czytelności, szybkości (jednak nie powinno to być znaczącą różnicą) i możesz kontrolować, które właściwości są porównywane (może twój Kontakt zawiera właściwość ciągu, której nie powinno się przeszukiwać).

Jeśli planujesz przedłużyć/zmienić typ Contact lub musisz sprawdzić duży fragment właściwości, chciałbym pójść z refleksją.

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: część wyjątek obsługi brakuje, ale jest na tyle łatwe do uwzględnienia.

+0

Dzięki Bala, tak czy inaczej powinienem użyć refleksji na ten temat? – Coder323

Powiązane problemy