La siguiente LINQ declaración:¿Por qué esta consulta LINQ-to-SQL obtiene una 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();
}
}
me da este error :
System.NotSupportedException: secuencia local no se puede utilizar en LINQ to SQL implementación de operadores de consulta, excepto el operador Contiene().
Mirando a su alrededor parece que mi única opción es conseguir todos mis artículosprimera en una lista genérica, y luego hacer una consulta LINQ en eso.
¿O hay una forma ingeniosa de reformular la instrucción LINQ-to-SQL anterior para evitar el error?
RESPUESTA:
Gracias Randy, su idea me ayudó a construir la siguiente solución. No es elegante, pero resuelve el problema y, dado que se generará un código, puedo manejar hasta, p. 20 términos de búsqueda sin ningún trabajo adicional:
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;
}
}
}
Tenga en cuenta que este no es un error "no implementado", es un error de "secuencia local no se puede utilizar". – Lucas
gracias, solucionado –
No estoy seguro de si estoy leyendo esto correctamente, hay muchos paréntesis, pero no veo una cláusula where bien formada. Your searchTerms.All() está devolviendo una lista de cadenas que no forma una cláusula where, de ahí el error. – Lazarus