Как реструктурировать запрос Linq, чтобы избежать использования Contains() внутри лямбда-выражения Any() (нужен containsAll())

#linq #linq-to-sql #lambda #contains

#linq #linq-to-sql #лямбда #содержит

Вопрос:

У меня есть запрос, который выдает исключение в Linq to Sql.

Local sequence cannot be used in LINQ to SQL implementation of query operators except the Contains() operator.

Я видел множество связанных вопросов, поэтому я (примерно) понимаю причину, по которой это не работает (значение term в лямбда-выражении не может быть преобразовано в строковое значение для SQL-запроса), но я не вижу, КАК это следует реструктурировать.

 var searchTerms = userQuery.Split(' ').ToList().ConvertAll(term => term.ToLower());

var qry = (from tree in someQueryable
           join widget in myDb.Widgets
           on tree.ParentId equals widget.Id
           where
               searchTerms.All(term => tree.Title.ToLower().Contains(term)    //Can't use Contains on term, as term isn't a local variable
               || searchTerms.All(term => widget.Title.ToLower().Contains(term)    //And again here
               || (tree.Description != null amp;amp; searchTerms.All(term =>
                                                tree.Description.ToLower().Contains(term)))    //And here
           orderby tree.SomeDate descending
           select tree);
  

Как я могу получить все, trees чей заголовок, описание или ParentWidget.Заголовок содержит ВСЕ условия поиска?

Я пробовал выполнять итерации по каждому термину, однако это приводит к проблеме сопоставления одного термина, а не всех терминов.

Обновление Я решил проблему … изменив свои требования 🙂 Мне все еще очень интересно узнать, как можно было бы достичь моих первоначальных требований.

Ответ №1:

 from term in SearchTerms
from tree in someQueryable
join widget in myDb.Widgets
where tree.Title.ToLower().Contains(term) ||
      widget.Title.TowLower().Contains(term) ||
      (tree.Description != null amp;amp; tree.Description.ToLower.Contains(term))
orderby tree.SomeDate descending
select tree
  

Комментарии:

1. Привет, msarchet, я только что опробовал ваше решение, и, похоже, оно соответствует результатам для одного термина. Например, если мои условия поиска «foo» и «bar», он вернет элементы с «foo», но не «bar», и наоборот. Не могли бы вы, пожалуйста, немного рассказать о том, как работает первая часть вашего запроса? Когда вы говорите «из x в foo из y в bar», это то же самое, что «для каждого x в foo (выполните каждый запрос y в bar)»?