Как проверить, содержит ли строка слово из другого списка, используя LINQ? - PullRequest
0 голосов
/ 17 апреля 2020
    public List<Article> Search(string input)
    {
        var searchQuery = input.Split(' ').ToList();
        List<Article> articlesResult = db.Articles
            .Where(a => searchQuery.Any(s => a.Title.Contains(s)))
            .ToList();

        return articlesResult;
    }

Цель запроса - найти все статьи, заголовок которых содержит слово из searchQuery, но EF не может его перевести. Если раньше я добавил AsEnumerable (). Где-то, он работает нормально, но тянет все статьи из БД.

1 Ответ

0 голосов
/ 17 апреля 2020

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

Если вы не ограничиваете себя Linq, есть другие способы выполнить sh без выполнения операций в памяти:

  • Создайте временную таблицу со своим списком и присоединитесь к этому в вашем SQL
  • Используйте хранимую процедуру и курсор
  • Используйте произвольное количество предложений LIKE (например, заголовок LIKE "% @ word1%" ИЛИ заголовок LIKE " % @ word2% ")

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

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