2014-08-25 2 views
1

В нашем пользовательском интерфейсе пользователи могут бесплатно отправлять текстовые запросы, применяемые к нескольким полям.Linq с несколькими содержит

  q = q.Where(p => p.Account.Contains(query) 
          || p.AccountName.Contains(query) 
          || p.AccountAKA.Contains(query) 
          || p.AccountRef.Contains(query)); 

Это означает SQL. Есть ли более оптимальный способ опроса, поскольку это происходит медленно.

Существует около 20 000 строк. Размер диска базы данных не имеет значения, использование памяти.

+0

Проблема в том, что 'LIKE% query%' недостаточно эффективен. Проблема может решить индексирование: http://blogs.msdn.com/b/varund/archive/2009/11/30/index-usage-by-like-operator-query-tuning.aspx –

+0

Единственное решение, которое я вижу решите, что нужно создать свою собственную таблицу индексирования (индексирование всех строк p.Account [x..y]). Но для этого требуется много памяти. Сколько строк у вас есть в базе данных? –

+1

Когда пользователь вводит запрос, он запрашивает базу данных синхронно или асинхронно? Потому что улучшение скорости запроса кажется довольно сложным. Таким образом, вы можете работать с самим пользователем. –

ответ

1

Поскольку все это текстовые поля, каждое из значений преобразуется в Account LIKE '%'+ query+ '%'. Все запросы с подстановочными знаками с обеих сторон будут медленными, к сожалению, не так много, что можно сделать.

Возможно, можно использовать StartsWith() вместо Contains()? Это переведет на `LIKE query + '%', который, как правило, намного быстрее?

1

Лучшим решением было бы изменить вашу модель данных и использовать столбец Description, в котором есть ВСЕ информация об имени учетной записи, чтобы вы могли сделать свой запрос в отношении одного столбца. Обновления к записи приводят к обновлению этого столбца Описание.

+0

О, согласен. Но иногда ограничения не позволяют этого :( –

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