#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)»?