代码之家  ›  专栏  ›  技术社区  ›  Hursey

按父属性分组的子对象属性的Linq和

  •  -2
  • Hursey  · 技术社区  · 7 年前

    在这件事上折腾了几个小时,但似乎还没完全弄好。通过OLEDB连接加载大型数据集,以便使用数据集和数据表

    所以我有以下数据表 Table structure

    我要做的是获取jobEstimate.Quantity的总和,按job.periodRequired分组,其中job.jobType=“q”、job.jobGroupCode=“Gold”和jobEstimate.productCode=“10000”

    到目前为止,我得到的最好的代码是下面的代码,但只给出第一个估计行的数量。

    var periodQuantity = from je in ds.JobEstimate
                join j in ds.Job on je.JobCode equals j.JobCode
                where je.ProductCode == "10000" &&
                    j.JobType == "Q" &&
                    j.JobGroupCode == "GOLD"
                group je by j.PeriodRequired into g
                select new { PeriodId = g.Key, Quantity = g.Sum(e => e.Quantity) };
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Anu Viswan    7 年前

    由于在这个问题中数据类型缺乏明确性,所以我尝试使用类来模拟它。请更改代码以适合您的数据类型

    public class Job
    {
    public string JobCode{get;set;}
    public string JobName{get;set;}
    public string PeriodRequired{get;set;}
    public string JobType{get;set;}
    public string JobGroupCode{get;set;}
    public DateTime DateRequired{get;set;}
    }
    
    public class JobEstimate
    {
    public string JobCode{get;set;}
    public string ProductCode{get;set;}
    public int Qty {get;set;}
    }
    

    例如数据

    var jobList = new List<Job>(){
        new Job{JobCode="abc1",JobName="JobName1",PeriodRequired="1",JobType="Q",JobGroupCode="GOLD"},
        new Job{JobCode="abc2",JobName="JobName1",PeriodRequired="2",JobType="Q",JobGroupCode="GOLD"},
        new Job{JobCode="abc3",JobName="JobName1",PeriodRequired="3",JobType="R",JobGroupCode="GOLD"},
        new Job{JobCode="abc4",JobName="JobName1",PeriodRequired="1",JobType="Q",JobGroupCode="GOLD"}
        };
    var jobEstimateList = new List<JobEstimate>(){
            new JobEstimate(){JobCode="abc1",ProductCode="10000",Qty=12},
            new JobEstimate(){JobCode="abc1",ProductCode="10000",Qty=11},
            new JobEstimate(){JobCode="abc2",ProductCode="10000",Qty=12},
            new JobEstimate(){JobCode="abc3",ProductCode="10000",Qty=14},
            };
    

    您可以获得所需的结果

    var result = jobList.Join(jobEstimateList,
                    job=> job.JobCode, 
                    je=>je.JobCode,(job,je)=>new {
                                            JobCode=job.JobCode,
                                            JobName = job.JobName,
                                            JobType = job.JobType,
                                            JobGroupCode = job.JobGroupCode,
                                            ProductCode = je.ProductCode,
                                            PeriodRequired = job.PeriodRequired,
                                            Qty = je.Qty})
                .Where(x=>x.JobType=="Q" && x.JobGroupCode=="GOLD" && x.ProductCode=="10000")
                .GroupBy(x=> x.PeriodRequired)
                .Select(x=> new {PeriodId = x.Key,Qty= x.Sum(c=>c.Qty)});
    

    结果

    PeriodId | Qty
      1      | 23 
      2      | 12