2012-10-11 3 views
8

Я пытаюсь реализовать поиск типа «omnibox» по базе данных клиента, где один запрос должен попытаться соответствовать любым свойствам клиента.Поиск по всем полям объекта

Вот некоторые данные примеры, чтобы проиллюстрировать то, что я пытаюсь достичь:

FirstName | LastName | PhoneNumber | ZipCode | ... 
-------------------------------------------------- 
Mary  | Jane  | 12345  | 98765 | ... 
Jane  | Fonda  | 54321  | 66666 | ... 
Billy  | Kid  | 23455  | 12345 | ... 
  • Если запрос был "Jane", я бы ожидать ряд # 1 должен быть возвращен, а также 2 строки #.
  • Запрос для 12345 даст строки # 1 и # 3.

Прямо сейчас, мой код выглядит так же, как это:

IEnumerable<Customer> searchResult = context.Customer.Where(
    c => c.FirstName == query || 
     c.LastName == query || 
     c.PhoneNumber == query || 
     c.ZipCode  == query 
     // and so forth. Fugly, huh? 
); 

Это, очевидно, работает. Это пахнет как действительно плохая практика для меня, так как любое изменение в Entity (удаление свойств, введение новых свойств) сломает материал.

Итак: есть ли какой-нибудь LINQ-foo, который будет искать по всем свойствам любого объекта, который я на него набрасываю?

+0

не мог» Вы делаете это, используя отражение? – IronMan84

+0

@ IronMan84 Как я могу это сделать? Просто начинать с C# и .net-файлов ... – vzwick

+0

- разве это не одна из приятных вещей? Если вы удалите свойство, вы получите ошибку компиляции. –

ответ

10

сначала найти все свойства в классе клиента с одного типа в качестве запроса:

var stringProperties = typeof(Customer).GetProperties().Where(prop => 
    prop.PropertyType == query.GetType()); 

затем найти всех клиентов из контекста, что имеет, по меньшей мере, одно свойство со значением, равным запросу:

context.Customer.Where(customer => 
    stringProperties.Any(prop => 
     prop.GetValue(customer, null) == query)); 
+0

За исключением того, что не все его свойства являются строками, такими как PhoneNumber или ZipCode. – IronMan84

+0

Вы имеете в виду тип 'запрос' не строка, а объект? – Bijan

+0

Это почти должно быть, не так ли? – IronMan84

Смежные вопросы