2010-01-20 6 views
4

J'utilise le code suivant pour retourner un IList:conversion Linq

public IList<string> FindCodesByCountry(string country) 
     { 
      var query = from q in session.Linq<Store>() 
         where q.Country == country 
         orderby q.Code 
         select new {q.Code}; 

      return (IList<string>) query.ToList(); 
     } 

Cependant, je continue à obtenir cette erreur:

Impossible de jeter l'objet de type « System.Collections.Generic.List 1[<>f__AnonymousType0 1 [System.String]] 'pour taper' System.Collections.Generic.IList`1 [System.String] '.

Qu'est-ce que je suis censé retourner ici?

Répondre

4

aussi longtemps que q.code est une chaîne cela devrait fonctionner: Notez qu'il ne crée pas un objet anonyme, juste la chaîne est sélectionnée.

public IList<string> FindCodesByCountry(string country) 
    { 
     var query = from q in session.Linq<Store>() 
        where q.Country == country 
        orderby q.Code 
        select q.Code; 

     return query.ToList(); 
    } 
+0

ouch ..... je ne sais pas comment j'ai raté ça ... Je pensais que j'avais ** à ** utiliser ** l'opérateur ** new ** pour retourner une seule colonne. – vikasde

0

Essayez ceci:

return query.ToList<string>(); 
2

Y a-t-il une raison pour laquelle vous avez sélectionné un type anonyme? Sinon, essayez ceci ...

var query = from q in session.Linq<Store>() 
       where q.Country == country 
       orderby q.Code 
       select q.Code; 
1

Que diriez-vous

query.Select(s => s.ToString()).ToList(); 

Ou

query.Cast<String>().ToList(); 

Mais je suppose que q.Code est une chaîne? Dans ce cas, vous voulez juste changer votre expression LINQ:

var query = from q in session.Linq<Store>() 
        where q.Country == country 
        orderby q.Code 
        select q.Code; 
1

Dans la requête, au lieu de sélectionner une classe anonyme contenant une chaîne, il suffit de sélectionner la chaîne elle-même:

var query = from q in session.Linq<Store>() 
      where q.Country == country 
      orderby q.Code 
      select q.Code; 
1

Vous ne pouvez pas lancer une liste de types personnalisés à une liste de chaînes comme ça. Le plus simple serait de faire en sorte que votre objet query commence sa vie sous la forme d'une liste de chaînes iEnumerable, plutôt que d'un type personnalisé. Changez votre ligne de sélection à:

select new q.Code.toString();

et vous serez bon. Si q.Code est lui-même une chaîne pour commencer, alors le .ToString() ne sera pas nécessaire.