visual studio online framework consultas conexion linq linq-to-sql

studio - Excepción de LINQ a SQL: la secuencia local no se puede usar en la implementación LINQ to SQL de operadores de consulta, excepto el operador Contiene



linq to sql visual studio 2017 (4)

Básicamente, el error indica que está haciendo una unión entre dos colecciones, una de las cuales es una tabla de base de datos, y la otra es una matriz. LINQ no está diseñado para manejar eso: ambos deben estar en la base de datos, o ambos en la memoria (con una excepción de caso especial al usar Contains )

Considere esta consulta de LINQ a SQL. Su intención es tomar una cadena [] de términos de búsqueda y aplicar los términos a un grupo de campos diferentes en la tabla SQL:

string[] searchTerms = new string[] {"hello","world","foo"}; List<Cust> = db.Custs.Where(c => searchTerms.Any(st => st.Equals(c.Email)) || searchTerms.Any(st => st.Equals(c.FirstName)) || searchTerms.Any(st => st.Equals(c.LastName)) || searchTerms.Any(st => st.Equals(c.City)) || searchTerms.Any(st => st.Equals(c.Postal)) || searchTerms.Any(st => st.Equals(c.Phone)) || searchTerms.Any(st => c.AddressLine1.Contains(st)) ) .ToList();

Una excepción se plantea:

La secuencia local no se puede usar en la implementación LINQ to SQL de operadores de consultas, excepto el operador Contiene ()

Pregunta: ¿Por qué se plantea esta excepción y cómo se puede reescribir la consulta para evitar esta excepción?


Estaba recibiendo el mismo error, pero ninguna de las soluciones publicadas anteriormente funcionó para mí.

Lo que funcionó para mí fue convertir db.Custs en una lista primero , así:

List<Cust> =db.Custs.ToList<Cust>.Where(...

No tengo idea de por qué funcionó, pero lo hizo.


Reemplace los usos de Cualquiera con Contiene en su consulta. p.ej:

searchTerms.Contains(c.Email)

Esto debería obtener el resultado que estás buscando. Mira hacia atrás, pero es correcto: generará un operador IN para cada campo dentro de un Contiene con todos los elementos en searchTerms.

La parte AddressLine1 no funcionará de esta manera; deberá generar las comparaciones usted mismo

c.addressLine1.Contains(...)

Algo como PredicateBuilder puede ser útil para esto.


Solo un pensamiento (no directamente relacionado con la pregunta, pero podría ayudar a otros espectadores):

Estaba recibiendo el mismo mensaje de error que tú, aunque estaba usando el método Contiene () correctamente, y me llevó bastante tiempo descubrir que la raíz de mi problema era devolver un IEnumerable a algo que necesitaba para filtrar aún más el resultados de la consulta L2S. Una vez que cambié el tipo de devolución de la función a una IQueryable, el problema desapareció. Tiene sentido, ya que un IEnumerable no se puede filtrar más, pero un IQueryable puede.