Link to Object et IEnumerable
Bonjour,
Voila j'ai une simple liste Annee contenant deux champs : IdAnnee et NomAnnee
Dans une méthode, j'ai crée une méthode QueryAnnee de type IEnumerable<Annee> dans laquelle je fais une requete link pour trier mes années
et pour pratiquer LINK ! voici la méthode :
Code:
1 2 3 4 5 6
| public static IEnumerable<Annee>QueryAnnee()
{
var Query = from a in LivreInit.CAnnees
orderby a.NomAnnee
select new { a.NomAnnee };
} |
Je souhaite à partir de là retourner le résultat de ma requête dans une liste afin de pouvoir l'utiliser comme bon me semble ! dans un listview par exemple
J'ai cherché dans les docs et sur le net des exemples, mais tous les exemples se terminent par un foreach et Console.Writeline pour afficher les données
n'étant pas à l'aise avec les collections, une personne pourrait t'elle m'expliquer comment je peux récupérer les données de ma méthode et donc de ma requête
par avance je vous remercie de votre aide
Cordialement
[Edit]
J'ai trouvé ça :
Code:
1 2 3 4 5 6 7 8
| public IEnumerable<Annee> QueryAnnee()
{
var Query = from a in LivreInit.CAnnees
orderby a.NomAnnee
select a;
return Query.OfType<Annee>().ToList<Annee>();
} |
Mais je ne sais pas si c'est vraiment conforme à la façon de faire habituel
Link to object et IEnumerablr
Merci pour votre réponse
Je considère à tord ou à raison que IE1numerable est un peu plus qu'une collection de List<>
D'ailleurs on alimente pas une collection de ce type par Add !
Et la requête de type retourne un type Anonyme, si j'en croit ce que j'ai lu
Mais ce que j'ai fait fonctionne
Cela dit des exemples peut être plus concret sur les comptabilités entre type de collection serait le bienvenu
Surtout que cela n'est pas toujours évident à bien cerner
Merci encore pour votre réponse
Cordialement
Link to Object et IEnumerable
Disons qu'après avoir lu un certains nombre d'ouvrage sur les collections, j'ai été un peu pris de cours sur le typage des collections
Sur les sites Américains il est dit :
1) On utilise var quand on ne connaît pas la structure des données à traiter
2) On utilise IEnumerable<Type> quand on connaît la structure du type a traiter
Dans mon exemple et même si C# utilise toujours le type anonyme pour ses requêtes
ma méthode était on ne peut plus typée :
Code:
1 2 3 4 5 6
| public static IEnumerable<Annee>QueryAnnee()
{
var Query = from a in LivreInit.CAnnees
orderby a.NomAnnee
select new { a.NomAnnee };
} |
Et mon propos donc était de dire que si j'écris un truc du genre :
Code:
List<Annee>Malist=new List<Annee>
pour récupérer le résultat de ma requête et
bien cela provoque un incompatible type !
Je ne sais d'ailleurs toujours pas comment faire
car ma requête dans le cas présent est récupérée dans control ObjectSource qui doit sans doute gérer le pbs!
En tout les cas merci de vos explications qui aurais tendances a confirmer que les conversions de type en C# sur les collections ne sont pas évidentes
Link to Object et IEnumerable
Je ne sais pas si vous avez lu l'excellent article de Johann Blais : Link to objets - l'envers du décors (que vous pouvez trouver sur ce site).
Johann Blais nous demontre avec l'outil reflector que les requêtes link par C# sont traitées par des délégués pointant sur des méthodes anonymes !
Cela n'est pas un choix de notre part, mais une façon de faire du compilateur !
Exemple :
1) Une simple liste
Code:
1 2 3 4 5 6 7 8 9 10
|
List<Produit> mesProduits = new List<Produit> {
new Produit { Nom = "Pinceau", Categorie = "Bricolage" },
new Produit { Nom = "Seau", Categorie = "Jardinage" },
new Produit { Nom = "Pelle", Categorie = "Jardinage" },
new Produit { Nom = "Ciseaux", Categorie = "Décoration" },
new Produit { Nom = "Tournevis", Categorie = "Bricolage" },
new Produit { Nom = "Feutre", Categorie = "Décoration" },
new Produit { Nom = "Peinture", Categorie = "Décoration" }
} |
2) Une classe
Code:
1 2 3 4 5 6
|
class Produit
{
public String Nom { get; set; }
public String Categorie { get; set; }
} |
3) Une très requête dans le Main
Code:
1 2 3 4 5 6
|
static void Main(string[] args)
{
var liste = from prod in mesProduits
select prod.Nom;
} |
Voici en fait la façon dont le compilateur C# traite la requete :
Code:
1 2 3 4 5 6 7 8 9 10 11
|
private static void Main(string[] args)
{
IEnumerable<string> liste;
liste = Enumerable.Select<Produit, string>(mesProduits,
(CS$<>9__CachedAnonymousMethodDelegate1 != null) ?
CS$<>9__CachedAnonymousMethodDelegate1 :
(CS$<>9__CachedAnonymousMethodDelegate1 = new
Func<Produit, string>(Program.<Main>b__0)));
return;
} |
En voit très clairement la confirmation de ses propos
Quand au mot clé new il est comme l'explique Johann Blais dans son article obligatoire en fonction de la complexité de la requête
Je terminerais par ce que disait Jon Skeet dans son livre C# in Depth, c'est à la fois très élégant et un peu lourd !!
Je partage pleinement son point de vu
En tout les cas merci pour vos lumières et vos conseils
je les prends en compte pour le futur
Cordialement