2009-10-12 17 views
5

No sé qué sucede aquí, cuando ejecuto la aplicación dice "El método especificado no es compatible" apuntando a "var result in query" en el bucle foreach. Por favor, ayuda ...foreach in linq result no funciona

var query = from c in entities.Customer 
      select c.CustomerName; 

List<string> customerNames = new List<string>(); 

foreach (var result in query) 
{ 
    customerNames.Add(result.ToString()); 
} 

EDITAR: al usar ToList() también aparece el mismo error.

+0

¿en qué línea? El único lugar aparente para el error es el resultado. –

+2

¿Qué es "entidades"? –

+0

realiza una Console.WriteLine (result.ToString()); ¿trabajo? –

Respuesta

5

El motivo de su error es alcance, que es lo que el error "método no admitido" le indica.

Esto generalmente ocurre cuando se utiliza un Linq para [llenar el espacio en blanco] ORM. Entonces, supongo que tus entidades deben ser de una herramienta ORM, algo así como Entity Framework, y estás usando algo como Linq to Entities.

Al usar linq su consulta no se enumera hasta que acceda a ella, lo que para un ORM significa golpear la base de datos u otro repositorio de datos. Esta acción retrasada puede causar un comportamiento extraño si no sabe que está allí, como este error.

Pero, tiene código local (no linq) y su consulta entrelazada, por lo que el compilador linq to [] no sabe cómo manejar su código local al compilar el código linq. Por lo tanto, el error "método no admitido" - es básicamente lo mismo que hacer referencia a un método privado desde fuera de la clase, el método que usted llamó es desconocido en el alcance actual.

En otras palabras, el compilador intenta compilar su consulta y acceder a la base de datos cuando realiza el resultado.ToString(), pero no sabe nada acerca de la variable privada de CustomerNames o el método foreach. La lógica de la base de datos y la lógica del objeto local deben mantenerse separadas: resuelva por completo los resultados de la consulta de la base de datos antes de usarla localmente.

Usted debe ser capaz de escribir así:

var customerNames = entities.Customer.Select(c => c.CustomerName).ToList(); 

Si usted tiene que mantener el foreach (por lógica más complicada, no para este sencillo de un ejemplo) que todavía tienen que resolver el LINQ to [] porción (forzándolo a enumerar los resultados de la consulta) antes de involucrar cualquier código que no sea linq:

var query = from c in entities.Customer 
      select c.CustomerName; 

var qryList = query.ToList(); 

List<string> customerNames = new List<string>(); 

foreach (var result in qryList) 
{ 
    customerNames.Add(result.ToString()); 
} 
+0

Tienes razón de que estoy usando el marco de entidad. Usando su solución, obtengo el mismo error en esta línea: var qryList = query.ToList(); gracias por su buena explicación. –

2

¿Puedes intentar usar solo el método ToList() en lugar del foreach?

List<string> customerNames = query.ToList(); 
+0

Ese es definitivamente el camino a seguir, pero no puedo ver cómo se resuelve el problema real. –

+0

Probablemente tengas razón, pero creo que vale la pena intentarlo. – jasonh

+0

Sí, esa será la manera correcta de llenar la lista de la consulta. Lo más sencillo posible. – Gart

0

Trate de no incluir .ToString() y ver si esto funciona:

foreach (var result in query) 
{ 
    customerNames.Add(result); 
} 

que parece ser que la raíz del problema se encuentra en el interior de mecanismo de traducción de consultas LINQ a SQL. Supongo que el motor de traducción intenta traducir .ToString() en SQL y falla allí.

+0

Lo he intentado pero sigue recibiendo el mismo error. –

0

probar esto

var query = from c in entities.Customer 
     select c.CustomerName; 

List<string> customerNames = new List<string>(); 

query.ToList().ForEach(r=>customerNames.Add(r)); 
1

Si el problema no es ToString() como Gart mentioned mis segundas caídas sospechosas en c.CustomerName. ¿Es esta una propiedad personalizada en tu clase parcial?

Además, el stacktrace de la excepción debe mostrar hoscamente cuál es el método no admitido.