2009-02-01 7 views
2

j'ai les objets de classe suivants:select collection d'objets d'enfant avec lambdas

public class VacancyCategory 
{ 
    public int ID { get; set; } 
    public string Text { get; set; } 
    public IList<VacancySubCategory> SubCategories { get; set; } 
} 

    public class VacancySubCategory 
{ 
    public int ID { get; set; } 
    public string Text { get; set; } 
    public VacancyCategory Category { get; set; } 
    public IList<Vacancy> Vacancies { get; set; } 
} 

    public class Vacancy : IBusinessObject 
{ 
    public int ID { get; set; } 
    public string Title { get; set; } 
    public VacancySubCategory SubCategory { get; set; } 
    public string Body { get; set; } 
    public VacancyWorkType WorkType { get; set; } 
    public string Salary { get; set; } 
    public DateTime? AppsClosingDate { get; set; } 
    public bool Active { get; set; } 
} 

... donc dans un référentiel de test im la création de données de test comme ceci:

 private IList<VacancyCategory> GetVacancyCategoriesWithAllChildCollections() 
    { 
     IList<VacancyCategory> vacancyCategories = new List<VacancyCategory>(); 

     int cCounter = 0; 
     int scCounter = 0; 
     int vCounter = 0; 
     for (int i = 1; i <= 3; i++) 
     { 
      VacancyCategory vc = new VacancyCategory(); 
      vc.ID = ++cCounter; 
      vc.Text = "VacancyCategory" + i.ToString(); 

      for (int j = 1; j <= 3; j++) 
      { 
       VacancySubCategory vsc = new VacancySubCategory(); 
       vsc.ID = ++scCounter; 
       vsc.Text = "VacancySubCategory" + scCounter.ToString(); 
       vsc.Category = vc; 

       for (int k = 1; k <= 2; k++) 
       { 
        Vacancy v = new Vacancy(); 
        v.ID = ++vCounter; 
        v.Title = "Vacancy" + vCounter.ToString(); 
        v.Body = "VacancyBody" + vCounter.ToString(); 
        v.Active = vCounter >= 16 ? false : true; 
        v.WorkType = this._workTypes.Single(wt => wt.ID == k); 
        v.Salary = vCounter <= 7 ? "SR " + (vCounter * 1000).ToString() : ""; 
        v.AppsClosingDate = (vCounter >= 3 & vCounter <= 13) ? (new DateTime(2009, 3, vCounter)) : (DateTime?)null; 
        v.SubCategory = vsc; 

        if (vsc.Vacancies == null) 
         vsc.Vacancies = new List<Vacancy>(); 
        vsc.Vacancies.Add(v); 
       } 

       if (vc.SubCategories == null) 
        vc.SubCategories = new List<VacancySubCategory>(); 
       vc.SubCategories.Add(vsc); 
      } 

      vacancyCategories.Add(vc); 
     } 

     return vacancyCategories; 
    } 

..so maintenant i avoir de bonnes données de test. l'arbre d'objet/les objets enchaînés sont importants pour moi. Donc, je voudrais retourner les collections d'objets individuels de cet arbre lorsque vous le souhaitez. Par exemple, si je voulais l'arbre entier, je peux juste retourner la liste VacancyCategory avec tous les objets enfants - super. mais maintenant je veux retourner juste les articles VacancySubCaregory (tous les 9 d'entre eux). ce serait ma méthode publique pour le référentiel de test:

 public IQueryable<VacancySubCategory> GetVacancySubCategories() 
    { 

     throw new NotImplementedException("write gen code"); 
    } 

.. évidemment sans exception. J'ai un champ membre appelé _categories qui contient les résultats de la méthode GetVacancyCategoriesWithAllChildCollections. donc j'ai essayé des trucs comme

this._categories.Select(...... 

..mais je ne peux pas l'impression de retourner une liste d'objets VacancySubCategory. il semble que je sélectionne toujours la collection racine (c'est-à-dire un ensemble de résultats d'objets VacancyCategory). Qu'est-ce que je fais mal? Je suis sûr que c'est simple ... mais ça me rend fou!

EDIT

thanx mate.

votre suggestion m'a conduit à ceci:

 public IQueryable<VacancySubCategory> GetVacancySubCategories() 
    { 
     return this._categories.SelectMany(c => c.SubCategories).AsQueryable<VacancySubCategory>(); 
    } 

..which fonctionne très bien. vous êtes un champion

Répondre

7

Essayez:

return this._categories.SelectMany(c => c.SubCategories); 
+0

pouvez-vous m'expliquer pourquoi retourner this._categories.Select (c => c.SubCategories); ne fonctionnerait pas? Quel est le problème avec SelectMany()? –

+0

Select() renvoie une liste de listes (une liste de sous-catégories pour chaque catégorie). SelectMany() est plus intelligent - il passe par chaque élément (chaque liste) et les joint dans une grande liste. –

+0

ahh. kool. cheerz –

1

Cela devrait fonctionner.

var query = from vc in GetVacancyCategoriesWithAllChildCollections() 
from vcs in vc.SubCategories 
select vcs