Следующая LINQ заявление:Почему этот запрос LINQ-to-SQL получает исключение NotSupportedException?
public override List<Item> SearchListWithSearchPhrase(string searchPhrase)
{
List<string> searchTerms = StringHelpers.GetSearchTerms(searchPhrase);
using (var db = Datasource.GetContext())
{
return (from t in db.Tasks
where searchTerms.All(term =>
t.Title.ToUpper().Contains(term.ToUpper()) &&
t.Description.ToUpper().Contains(term.ToUpper()))
select t).Cast<Item>().ToList();
}
}
дает мне эту ошибку :
System.NotSupportedException: Локальная последовательность не может быть использован в LINQ к SQL реализации операторов запроса за исключением оператор Contains().
Глядя вокруг него, кажется, мой единственный вариант, чтобы получить все мои детали первый в общий список, а затем сделать запрос LINQ на этом.
Или есть умный способ перефразировать вышеуказанный оператор LINQ-to-SQL, чтобы избежать ошибки?
ОТВЕТ:
Благодаря Рэнди, ваша идея помогла мне построить следующее решение. Это не изящно, но оно решает проблему, и поскольку это будет сгенерировано кодом, я могу обработать до, например, 20 поисковых терминов без дополнительной работы:
public override List<Item> SearchListWithSearchPhrase(string searchPhrase)
{
List<string> searchTerms = StringHelpers.GetSearchTerms(searchPhrase);
using (var db = Datasource.GetContext())
{
switch (searchTerms.Count())
{
case 1:
return (db.Tasks
.Where(t =>
t.Title.Contains(searchTerms[0])
|| t.Description.Contains(searchTerms[0])
)
.Select(t => t)).Cast<Item>().ToList();
case 2:
return (db.Tasks
.Where(t =>
(t.Title.Contains(searchTerms[0])
|| t.Description.Contains(searchTerms[0]))
&&
(t.Title.Contains(searchTerms[1])
|| t.Description.Contains(searchTerms[1]))
)
.Select(t => t)).Cast<Item>().ToList();
case 3:
return (db.Tasks
.Where(t =>
(t.Title.Contains(searchTerms[0])
|| t.Description.Contains(searchTerms[0]))
&&
(t.Title.Contains(searchTerms[1])
|| t.Description.Contains(searchTerms[1]))
&&
(t.Title.Contains(searchTerms[2])
|| t.Description.Contains(searchTerms[2]))
)
.Select(t => t)).Cast<Item>().ToList();
default:
return null;
}
}
}
Обратите внимание, что это не ошибка «не реализована», это ошибка «локальная последовательность не может быть использована». – Lucas
спасибо, исправлено, что –
Я не уверен, правильно ли я это читаю, много скобок, но я не вижу хорошо сформированного предложения where. Ваш поискTerms.All() возвращает список строк, которые не образуют предложение where, следовательно, ошибка. – Lazarus