GroupBy查询选择最后一项

时间:2017-07-14 17:24:40

标签: c# entity-framework linq

有一个作业和部件号将分配多个操作,我试图找到作业的最后一个操作,只将其写入文件。

using (var contextDb = new TimoToolEntities())
{
    using (var writeFile = new StreamWriter(saveTo))
    {

        var randomData = contextDb.WorkCenter_Operations
            .OrderBy(j => j.Job_Number)
            .ThenBy(p => p.Part_Number).
             ThenByDescending(o => o.Oper_Number)
            .Select(s => new
            {
                PartNumber = s.Part_Number,
                JobNumber = s.Job_Number,
                OpNumber = s.Oper_Number,
                OpDesc = s.Oper_Description,
                PlanComp = s.Planned_Complete

            }).GroupBy(c => new 
            {
                c.JobNumber,
                c.PartNumber,
                c.OpNumber,
                c.OpDesc,
                c.PlanComp

            });

        foreach (var record in randomData)
        {

            Console.WriteLine(string.Format(
                "Job Number: {0} Part Number: {1} Op Number: {2} Op Desc: {3} Plan Complete: {4}\n", 
                record.Key.JobNumber, 
                record.Key.PartNumber, 
                record.Key.OpNumber, 
                record.Key.OpDesc,
                record.Key.PlanComp)); 
        }
    }
}

我曾尝试使用Last(),LastorDefault()甚至Max()(因为操作编号增加直到作业完成)但是无论我把调用放在哪里,下一个函数都说不包含它的定义。如何选择上一个操作以及随之而来的数据?

2 个答案:

答案 0 :(得分:2)

如果您想要每个作业和部件号的最后一个,那么第一个组然后通过对操作号进行排序并选择第一个来选择每个组中具有最高操作号的那个。

If Tag1 and Tag2 exist => true
If either Tag1 or Tag2 is missing` => false

答案 1 :(得分:0)

按相反的顺序对数据进行排序,然后进行顶部1.首先进行分组,然后按相反的顺序排序并排在前1位。

下面的代码段显示了如何使用LINQ完成它。

 var randomData = contextDb.WorkCenter_Operations
                    .Select(s => new
                    {
                        PartNumber = s.Part_Number,
                        JobNumber = s.Job_Number,
                        OpNumber = s.Oper_Number,
                        OpDesc = s.Oper_Description,
                        PlanComp = s.Planned_Complete

                    }).GroupBy(s => s).ToDictionary(k => k.Key, v => v.ToList());

foreach (var record in randomData)
{
    var rec = record.OrderBy(j => j.JobNumber).ThenBy(p => p.PartNumber).
                     ThenByDescending(o => o.OperNumber).Take(1);
    Console.WriteLine(string.Format("Job Number: {0} Part Number: {1} Op Number: {2} Op Desc: {3} Plan Complete: {4}\n", rec.JobNumber, rec.PartNumber, record.OpNumber, rec.OpDesc, rec.PlanComp));
}

您可能需要根据数据定义分组键。