Есть ли способ оптимизировать это предложение LINQ where, которое ищет несколько ключевых слов в нескольких столбцах? - PullRequest
0 голосов
/ 22 мая 2010

У меня есть запрос LINQ, который ищет несколько ключевых слов в нескольких столбцах.Предполагается, что пользователь может искать несколько ключевых слов, и он будет искать ключевые слова в каждом свойстве моего объекта Media.Вот упрощенный пример:

var result = repository.GetAll<Media>().Where(x =>
    x.Title.Contains("Apples") || x.Description.Contains("Apples") || x.Tags.Contains("Apples") ||
    x.Title.Contains("Oranges") || x.Description.Contains("Oranges") || x.Tags.Contains("Oranges") ||
    x.Title.Contains("Pears") || x.Description.Contains("Pears") || x.Tags.Contains("Pears")
);

Другими словами, я хочу найти ключевые слова Apples, Oranges и Pears в столбцах Title, Description иTags.

Вывод SQL выглядит следующим образом:

SELECT *
FROM Media this_
WHERE  ((((((((
       this_.Title like '%Apples%'
    or this_.Description like '%Apples%')
    or this_.Tags like '%Apples%')

    or this_.Title like '%Oranges%')
    or this_.Description like '%Oranges%')
    or this_.Tags like '%Oranges%')

    or this_.Title like '%Pears%')
    or this_.Description like '%Pears%')
    or this_.Tags like '%Pears%')

Является ли это наиболее оптимальным SQL в этом случае?Если нет, то как мне переписать запрос LINQ, чтобы создать наиболее оптимальный оператор SQL?Я использую SQLite для тестирования и SQL Server для реального развертывания.

Ответы [ 2 ]

2 голосов
/ 22 мая 2010

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

С точки зрения чисто L2S вы мало что можете сделать. Но если вы сможете включить полнотекстовый поиск, у вас будут гораздо лучшие инструменты для ускорения запроса.

См. Этот пост переполнения стека для получения дополнительной информации.

0 голосов
/ 22 мая 2010

Я не понимаю, как это может быть значительно быстрее, если честно. По общему признанию, подстановочный знак «содержит», скорее всего, будет довольно медленным для начала (по сравнению с «начинается с», например).

Вы смотрели на план выполнения SQL Server? Какова реальная производительность с реалистичным набором данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...