Linq, как поиск по нескольким полям - PullRequest
2 голосов
/ 27 сентября 2011

Я пытаюсь создать простой адресный экран, где у пользователя есть единое поле запроса в стиле «Google», в котором выполняется поиск по всем адресным полям, например, адресная строка 1, город, город, почтовый индекс и т. Д.Я использую .net и EF с базой данных SQL.Я пробовал

IEnumerable<T> results = from x in dbSet
                         where (x.AddressLine1 + x.AddressLine2 + 
                                x.AddressLine3 + x.Town + x.City + 
                                x.County + x.Postcode).Contains(Query)
                         select x;

Это не соответствует никаким результатам, когда это должно.Если я изменяю его на

IEnumerable<T> results = from x in dbSet
                         where x.AddressLine1.Contains(Query)
                         select x;

, он совпадает и возвращает результаты, но, очевидно, он не ищет во всех полях.Первый вопрос, почему мой первый пример не работает, а второй - это лучший способ реализовать это или он будет бороться под давлением.

Ответы [ 3 ]

3 голосов
/ 27 сентября 2011

Попробуйте:

IEnumerable<T> results = from x in dbSet
                         where x.AddressLine1.Contains(Query) ||
                         x.AddressLine2.Contains(Query) ||
                         x.AddressLine3.Contains(Query) ||
                         x.Town.Contains(Query) ||
                         x.City.Contains(Query) ||
                         x.County.Contains(Query) ||
                         x.Postcode
                         select x;

Для более сложных поисков с использованием Linq я использую LinqKit

2 голосов
/ 27 сентября 2011

Ваш текущий подход потребует полного сканирования таблицы с некоторыми операциями сопоставления подстрок в каждой строке - я не могу себе представить, что это выполняется на большой таблице. Что вы действительно должны сделать, это использовать полный текст SQL. В EF нет встроенной поддержки для этого, но вы можете использовать хранимую процедуру или сохранить запрос.

1 голос
/ 27 сентября 2011

что произойдет, если вы используете это

IEnumerable<T> results = from x in dbSet
 where x.AddressLine1.ToString().Contains(Query) ||
   x.AddressLine2.ToString().Contains(Query) ||
   x.AddressLine3.ToString().Contains(Query) || 
   x.Town.ToString().Contains.(Query)||  
   x.City.ToString().Contains.(Query) || 
   x.Postcode.ToString().Contains(Query)
 select x;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...