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

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

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

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?
);

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

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

 IronMan8411 окт. 2012 г., 19:06
Не могли бы вы сделать это с помощью отражения?
 AD.Net11 окт. 2012 г., 19:09
разве это не самое приятное? Если вы удалите свойство, вы получите ошибку компиляции.
 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));
 fdelia30 янв. 2018 г., 11:13
Просто был похожий случай: оказалось, что выполнение SQL напрямую эффективно и быстро.
 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
ты имеешь в виду тип 'запрос' не строка, а объект?
 IronMan8411 окт. 2012 г., 19:47
За исключением того, что не все его свойства являются строками, такими как PhoneNumber или ZipCode.
 IronMan8411 окт. 2012 г., 20:00
Это почти должно быть, не так ли?

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