2009-10-12 13 views
5

Non so cosa c'è che non va qui, quando eseguo l'applicazione dice "Il metodo specificato non è supportato" puntando a "var result in query" nel ciclo foreach. Please help ...foreach in linq risultato non funzionante

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()); 
} 

MODIFICA: utilizzando ToList() viene restituito lo stesso errore.

+0

in quale linea? L'unico punto apparente per l'errore è il risultato. –

+2

Cosa sono le "entità"? –

+0

fa un Console.WriteLine (result.ToString()); lavoro? –

risposta

5

Il motivo dell'errore è l'ambito, che è quello che l'errore "metodo non supportato" sta dicendo.

Questo di solito accade quando si usa un Linq per [riempire il bianco] ORM. Quindi, immagino che le tue entità debbano provenire da uno strumento ORM, qualcosa come Entity Framework, e tu stai usando qualcosa come Linq alle Entità.

Quando si utilizza linq, la query non viene enumerata fino a quando non si accede ad essa, che per un ORM significa colpire il database o altro repository di dati. Questa azione ritardata può causare un comportamento strano se non si sa che c'è, come questo errore.

Tuttavia, il codice locale (non linq) e la query sono intrecciati, quindi il compilatore da linq a [] non sa come gestire il codice locale durante la compilazione del codice linq. Quindi l'errore "metodo non supportato" - è fondamentalmente lo stesso che fare riferimento a un metodo privato al di fuori della classe, il metodo che hai chiamato è sconosciuto nell'attuale scope.

In altre parole, il compilatore tenta di compilare la query e colpisce il database quando si esegue il risultato. ToString(), ma non conosce nulla sulla variabile privata di CustomerNames o sul metodo foreach. La logica del database e la logica dell'oggetto locale devono essere mantenute separate: risolvere completamente i risultati delle query del database prima di utilizzarle localmente.

Si dovrebbe essere in grado di scrivere in questo modo:

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

Se si dispone di mantenere il foreach (per la logica più complicato, non per questo semplice di un esempio) è ancora necessario risolvere il LINQ to [] porzione (forzandolo per enumerare i risultati della query) prima di coinvolgere qualsiasi codice non-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

Hai ragione che sto usando il framework di entità. Usando la tua soluzione sto ricevendo lo stesso errore in questa riga: var qryList = query.ToList(); grazie per la tua buona spiegazione. –

2

Si può provare a utilizzare solo il metodo ToList() anziché lo foreach?

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

Questa è sicuramente la strada da percorrere, ma non riesco a vedere come risolve il problema reale. –

+0

Probabilmente hai ragione, ma immagino valga la pena provare. – jasonh

+0

Sì, quello sarà il modo giusto per riempire l'elenco dalla query. Il più semplice possibile. – Gart

0

provare a rimuovere .ToString() e vedere se questo funzioni:

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

Sembra come che la radice del problema risiede nel profondo meccanismo di traslazione query LINQ to SQL. Suppongo che il motore di traduzione tenti di tradurre .ToString() in SQL e non ci riesca.

+0

Ho provato ma continuo a ottenere lo stesso errore. –

0

provare questo

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

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

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

Se il problema non è ToString() come Gart mentioned mio secondo cadute sospetti in c.CustomerName. Questa è una proprietà personalizzata nella tua classe parziale?

Inoltre, lo stacktrace dell'eccezione deve mostrare scarsamente quale sia il metodo non supportato.