I have the following class objects:
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; } }
…so in a test repository im creating test data like so:
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 now i have some good test data. the object tree / chained objects are important to me.
so i’d like to return the individual object collections from this tree when desired. for example, if i wanted the whole tree, i can just return the VacancyCategory list with all the child objects – great. but now i want to return just the VacancySubCaregory items (all 9 of them). this would be my public method to the test repository:
public IQueryable<VacancySubCategory> GetVacancySubCategories() { throw new NotImplementedException('write gen code'); }
.. obviously without the exception. i have a member field called _categories that contains the results from the GetVacancyCategoriesWithAllChildCollections method. so i’ve been trying stuff like
this._categories.Select( ......
..but i cant seem to return a list of VacancySubCategory objects. i seem to always be selecting the root collection (ie. a result set of VacancyCategory objects). What am i doing wrong? im sure its simple… but its driving me nuts!
EDIT
thanx matt.
your suggestion led me to this:
public IQueryable<VacancySubCategory> GetVacancySubCategories() { return this._categories.SelectMany(c => c.SubCategories).AsQueryable<VacancySubCategory>(); }
..which works great. you’re a champ
Try: