Как реструктурировать запрос Linq, чтобы избежать использования Contains () внутри лямбда-выражения Any () (нужен ContainsAll ()) - PullRequest
1 голос
/ 02 июня 2011

У меня есть запрос, который выдает исключение в Linq для 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 && searchTerms.All(term =>
                                                tree.Description.ToLower().Contains(term)))    //And here
           orderby tree.SomeDate descending
           select tree);

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

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

Обновление Я решил проблему ... изменив мои требования :) Мне все еще очень интересно узнать, как мои первоначальные требования могут быть достигнуты.

1 Ответ

0 голосов
/ 03 июня 2011
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 && tree.Description.ToLower.Contains(term))
orderby tree.SomeDate descending
select tree
...