【问题标题】:select child object collection with lambdas使用 lambda 选择子对象集合
【发布时间】:2009-02-01 07:19:27
【问题描述】:

我有以下类对象:

    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 对象的结果集)。我究竟做错了什么?我确定它很简单......但它让我发疯了!

编辑

谢谢马特。

你的建议让我想到了这个:

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

..效果很好。你是冠军

【问题讨论】:

    标签: c# object lambda extension-methods linq-to-objects


    【解决方案1】:

    试试:

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

    【讨论】:

    • 你能解释一下为什么返回 this._categories.Select(c => c.SubCategories);行不通?与 SelectMany() 有什么关系?
    • Select() 将返回列表列表(每个类别的子类别列表)。 SelectMany() 更智能 - 它遍历每个元素(每个列表)并将它们加入一个大列表。
    【解决方案2】:

    这应该可行。

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

    【讨论】:

      猜你喜欢
      • 2013-01-19
      • 1970-01-01
      • 2021-04-12
      • 2013-03-26
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      相关资源
      最近更新 更多