【问题标题】:LINQ remove items with specific value in group byLINQ 删除分组中具有特定值的项目
【发布时间】:2015-05-28 09:49:45
【问题描述】:

我有代码按机会编号对我的要求进行分组,如下所示:

        List<Requirement> result = requirements
                                    .GroupBy(l => l.CRMOpportunityNumber)
                                    .Select(cl => new Requirement
                                    {
                                        CRMOpportunityNumber = cl.First().CRMOpportunityNumber,
                                        OpportunityTitle = cl.First().OpportunityTitle,
                                        ClientName = cl.First().ClientName,
                                        TentativeStartDate = cl.Min(c => c.TentativeStartDate),
                                        TotalPositions = cl.Sum(c => c.Required),
                                        RegionName = cl.First().RegionName,
                                        TotalCVProposed = cl.Sum(c => c.Associates.Count),
                                        TotalDeployed = cl.Sum(c => c.Associates.Count(x => x.IsIdentified == true)),
                                        NetGap = cl.Sum(c => c.Required) - cl.Sum(c => c.Associates.Count(x => x.IsIdentified == true)),
                                    }).OrderByDescending(l => l.CRMOpportunityNumber).ToList();

现在我不想在分组(结果)中包含所有 CATEGORY 字段值等于“工作开始”的要求。

需求类有一个字段类别。

【问题讨论】:

    标签: c# linq group-by


    【解决方案1】:

    在分组前使用 Where 子句排除“已开始工作”类别

        List<Requirement> result = requirements
                                    .Where(r => r.Category != "work commenced")
                                    .GroupBy(l => l.CRMOpportunityNumber)
                                    .Select(cl => new Requirement
                                    {
                                        CRMOpportunityNumber = cl.First().CRMOpportunityNumber,
                                        OpportunityTitle = cl.First().OpportunityTitle,
                                        ClientName = cl.First().ClientName,
                                        TentativeStartDate = cl.Min(c => c.TentativeStartDate),
                                        TotalPositions = cl.Sum(c => c.Required),
                                        RegionName = cl.First().RegionName,
                                        TotalCVProposed = cl.Sum(c => c.Associates.Count),
                                        TotalDeployed = cl.Sum(c => c.Associates.Count(x => x.IsIdentified == true)),
                                        NetGap = cl.Sum(c => c.Required) - cl.Sum(c => c.Associates.Count(x => x.IsIdentified == true)),
                                    }).OrderByDescending(l => l.CRMOpportunityNumber).ToList();
    

    编辑

    如果您想排除所有要求都属于“工作已开始”类别的组,该怎么办:

    List<Requirement> result = requirements
        .GroupBy(l => l.CRMOpportunityNumber)
        .Where(cl => cl.All(l => l.Category != "work commenced"))
        .Select(cl => new Requirement
        {
            CRMOpportunityNumber = cl.First().CRMOpportunityNumber,
            OpportunityTitle = cl.First().OpportunityTitle,
            ClientName = cl.First().ClientName,
            TentativeStartDate = cl.Min(c => c.TentativeStartDate),
            TotalPositions = cl.Sum(c => c.Required),
            RegionName = cl.First().RegionName,
            TotalCVProposed = cl.Sum(c => c.Associates.Count),
            TotalDeployed = cl.Sum(c => c.Associates.Count(x => x.IsIdentified == true)),
            NetGap = cl.Sum(c => c.Required) - cl.Sum(c => c.Associates.Count(x => x.IsIdentified == true))
        }).OrderByDescending(l => l.CRMOpportunityNumber)
        .ToList();
    

    【讨论】:

    • 我认为这将排除“工作开始”的任何要求。我想排除那些所有分组要求的类别等于“工作开始”的分组要求。组内所有要求的类别不应该是“工作开始”
    • 您的意思是仅当组中的每个需求都具有“开始工作”类别时才要排除组?
    【解决方案2】:

    如果该组中的所有项目的 CATEGORY 字段值等于“工作开始”,您希望排除该组。换句话说,如果组中的任何项目具有“工作开始”以外的值,则您希望包括该组。这可以使用 LINQ Any() 来实现,如下所示:

    List<Requirement> result = 
                        requirements.GroupBy(l => l.CRMOpportunityNumber)
                                    .Where(g => g.Any(item => item.Category != "work commenced")
                                    .Select(cl => new Requirement
                                    {
                                        ......
                                    }).OrderByDescending(l => l.CRMOpportunityNumber)
                                    .ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多