2010-02-01 1 views
3

Essayer de récupérer des données en utilisant linq à partir d'une base de données. Je voudrais utiliser des types anonymes et convertir en un Ilist, Array, ArrayList ou Collection. Les données sont utilisées dans un objet tiers qui accepte Ilist, arraylist ou collections.Convertir un type anonyme en tableau ou arraylist. Peut-il être fait?

Je n'arrive pas à faire marcher ça. Je reçois l'erreur suivante, « les opérateurs de séquence non pris en charge pour le type« System.String »

using (var db = new dbDataContext()) 
{ 
    var query = from e in db.people 
       select new 
       { 
        Count = e.LastName.Count() 
       }; 

    Array test; 
    test = query.ToArray(); 
} 
+0

Étrange, cela fonctionne pour moi: int [] iss = {324, 4, 3, 2, 1}; var query = à partir de e dans iss select new { Nombre = e }; Test de matrice; test = query.ToArray(); – jestro

Répondre

8

Cela n'a rien à voir avec la conversion des résultats des listes de tableau, ou même des types anonymes. Voici une autre version de votre code qui échouera:

using (var db = new dbDataContext()) 
{ 
    var query = db.people.Select(x => x.LastName.Count()); 
    foreach (int x in query) 
    { 
     Console.WriteLine(x); 
    } 
} 

Ce sera toujours pas de la même façon - parce qu'il est la traduction de ce bit:

x => x.LastName.Count() 

dans SQL qui est à l'origine des problèmes.

Modifier à:

x => x.LastName.Length 

et je soupçonne que vous trouverez cela fonctionne. Notez que ce n'est pas vraiment un problème de C# - c'est juste des capacités de traduction de LINQ to SQL.

Je suggère que vous ne pas utiliser un type anonyme ici si - c'est inutile. Peut-être que ce n'est pas votre code complet, mais en général si vous vous trouvez en train de créer un type anonyme avec un seul membre, demandez-vous si cela vous fait vraiment du bien.

+0

Pourquoi est-ce inutile? Quel serait le meilleur moyen d'obtenir la table SELECT COUNT (*) FROM dans LINQ? –

+0

@Dwight T: J'utiliserais 'db.people.Count()'. Même si vous avez besoin d'un filtrage, etc., vous n'avez pas besoin d'un type anonyme. –

2

La classe ArrayList a un constructeur qui accepte ICollection.
Vous devriez être en mesure de lui fournir une version liste de votre résultat LINQ. Je n'ai pas Visual Studio ici (je suis sur mon Mac), mais cela peut être utile. (ToArray devrait suffire également)

Vous devrez peut-être remplacer votre Count() par Length.

Questions connexes