Поиск по всем полям сущности

я пытаюсь реализовать "омнибокс»-тип поиска по базе данных клиентов, где один запрос должен пытаться соответствовать любым свойствам клиента.

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

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

Прямо сейчас мой код выглядит примерно так:

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

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

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

 IronMan8411 окт. 2012 г., 19:06
не мог»Вы делаете это с помощью отражения?
 AD.Net11 окт. 2012 г., 19:09
ISN»это одна из приятных вещей? Если вы удалите собственность, вы 'Я получу ошибку компиляции.
 IronMan8411 окт. 2012 г., 19:11
@ AD.Net Но он может также захотеть, чтобы он стал более гибким до такой степени, что он мог бы добавить больше свойств, и он все равно работал бы так же. Следовательно, почему я упомянул рефлексию.
 vzwick11 окт. 2012 г., 19:08
@ IronMan84 Как мне поступить? Просто начинаю с c # и .net вещей ...
 vzwick11 окт. 2012 г., 19:14
@ AD.Net Я думаю, это зависит от того, как вы на это смотрите. Я'Я бы не стал переписывать все мои запросы каждый раз, когда свойство добавляется к сущности или удаляется из нее. Также,люди склонны забывать о вещах; недвижимостьдобавленной к сущности, но не к запросу выигралВыдает ошибку компилятора. Компилятор победилне делай мне этого.

Ответы на вопрос(1)

Решение Вопроса

что и запрос:

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

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

context.Customer.Where(customer => 
    stringProperties.Any(prop =>
        prop.GetValue(customer, null) == query));
 IronMan8411 окт. 2012 г., 20:00
Это почти должно быть, не так лине так ли?
 Bizhan11 окт. 2012 г., 20:09
Я отредактировал ответ. это то что тебе нужно?
 vzwick11 окт. 2012 г., 20:30
Гениальное решение! FYI,query на самом деле строка, так как яя имею дело сWebApi, Поэтому я перебрал все свойства (не только строки) и вызвал.ToString() на них (очевидно, ловитьnull значения в процессе)..Any часть сейчас выглядит так:.Any(prop => ((prop.GetValue(customer, null) == null) ? "" : prop.GetValue(customer, null).ToString().ToLower()) == query)
 Bizhan11 окт. 2012 г., 19:54
ты имеешь в виду типзапрос» это не строка, а объект?
 sapatelbaps20 февр. 2016 г., 13:43
Он может искать правильно, но это занимает много времени. Просто для 872 записей класса с 15 свойствами это занимает 6 минут ..... есть ли другое решение для этого? Thnx.
 fdelia30 янв. 2018 г., 11:13
Просто был похожий случай: оказалось, что выполнение SQL напрямую эффективно и быстро.
 Bizhan21 февр. 2016 г., 12:57
Я знаю это'Это не оптимальный поиск, в вашем случае я предлагаю простые методы, такие как длинные хранимые процедуры для больших таблиц, обращающихся к столбцам отдельно. или написание 15 последовательных поисковых запросов, читающих из того же контекста.
 IronMan8411 окт. 2012 г., 19:47
За исключением того, что не все его свойства являются строками, такими как PhoneNumber или ZipCode.

Ваш ответ на вопрос