2009-10-12 8 views
5

Ne sait pas ce qui ne va pas ici, quand j'exécute l'application, il dit "La méthode spécifiée n'est pas supportée" pointant sur "var résultat dans la requête" dans la boucle foreach. S'il vous plaît aider ...foreach in linq résultat ne fonctionne pas

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

EDIT: en utilisant ToList() donne également la même erreur.

+0

à quelle ligne? Le seul endroit apparent pour l'erreur est le résultat. –

+2

Qu'est-ce que "entités"? –

+0

fait un Console.WriteLine (result.ToString()); travail? –

Répondre

5

La raison de votre erreur est portée, qui est ce que l'erreur "méthode non prise en charge" vous indique. Cela se produit généralement lors de l'utilisation d'un Linq pour [remplir l'ORM vierge]. Donc, je suppose que vos entités doivent provenir d'un outil ORM, quelque chose comme Entity Framework, et que vous utilisez quelque chose comme Linq to Entities. Lorsque vous utilisez linq, votre requête n'est pas énumérée jusqu'à ce que vous y accédiez, ce qui pour un ORM signifie cliquer sur la base de données ou un autre référentiel de données. Cette action retardée peut provoquer un comportement étrange si vous ne le savez pas, comme cette erreur. Mais, vous avez un code local (non-linq) et votre requête entrelacée, donc le compilateur linq to [] ne sait pas comment gérer votre code local lors de la compilation du code linq. Ainsi, l'erreur "méthode non supportée" - c'est fondamentalement la même chose que de référencer une méthode privée depuis l'extérieur de la classe, la méthode que vous avez appelée est inconnue dans la portée actuelle.

En d'autres termes, le compilateur tente de compiler votre requête et de la lire lorsque vous faites le résultat. ToString(), mais ne sait rien de la variable privée de CustomerNames ou de la méthode foreach. La logique de la base de données et la logique de l'objet local doivent être séparées - résolvez complètement les résultats de la requête de la base de données avant de l'utiliser localement.

Vous devriez pouvoir l'écrire comme ceci:

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

Si vous devez garder le foreach (pour la logique plus complexe, non pas pour ce simple d'un exemple), vous avez encore besoin de résoudre le Linq à [] partie (en le forçant à énumérer les résultats de la requête) avant d'impliquer tout code 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

Vous avez raison d'utiliser le framework d'entité. En utilisant votre solution, j'obtiens la même erreur dans cette ligne: var qryList = query.ToList(); merci pour votre bonne explication. –

2

Pouvez-vous essayer en utilisant simplement la méthode ToList() au lieu du foreach?

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

C'est certainement la voie à suivre, mais je ne vois pas comment cela résout le problème réel. –

+0

Vous avez probablement raison, mais je pense que ça vaut le coup. – jasonh

+0

Oui, ce sera la bonne façon de remplir la liste de la requête. Aussi simple que possible. – Gart

0

Essayez de supprimer .ToString() et voir si cela fonctionnera:

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

On dirait que la racine du problème se trouve au fond de mécanisme LINQ to SQL traduction de la requête. Je suppose que le moteur de traduction essaie de traduire .ToString() en SQL et échoue là.

+0

J'ai essayé mais j'ai toujours la même erreur. –

0

essayer cette

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 le problème ne ToString() que Gart mentioned mon deuxième chutes suspectes dans c.CustomerName. Est-ce une propriété personnalisée dans votre classe partielle?

En outre, la pile de l'exception doit indiquer clairement quelle est la méthode non prise en charge.