выберите коллекцию дочерних объектов с лямбдами - PullRequest
2 голосов
/ 01 февраля 2009

У меня есть следующие объекты класса:

    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; }
}

... поэтому в тестовом хранилище я создаю тестовые данные примерно так:

        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;
    }

.. так что теперь у меня есть хорошие тестовые данные. дерево объектов / связанные объекты важны для меня.

поэтому я бы хотел при желании возвращать отдельные коллекции объектов из этого дерева. например, если мне нужно все дерево, я могу просто вернуть список VacancyCategory со всеми дочерними объектами - отлично. но теперь я хочу вернуть только предметы VacancySubCaregory (все 9 из них). это будет мой публичный метод для тестового репозитория:

        public IQueryable<VacancySubCategory> GetVacancySubCategories()
    {

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

.. очевидно, без исключения. у меня есть поле члена под названием _categories, которое содержит результаты метода GetVacancyCategoriesWithAllChildCollections. так что я пробовал что-то вроде

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

.. но я не могу вернуть список объектов VacancySubCategory. Кажется, я всегда выбираю корневую коллекцию (т.е. набор результатов объектов VacancyCategory). Что я делаю неправильно? Я уверен, что это просто ... но это сводит меня с ума!

EDIT

спасибо Мэтт.

Ваше предложение привело меня к этому:

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

.., который прекрасно работает. ты чемпион

Ответы [ 2 ]

7 голосов
/ 01 февраля 2009

Попробуйте:

return this._categories.SelectMany(c => c.SubCategories);
1 голос
/ 01 февраля 2009

Это должно работать.

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