Linq组通过使用Max生成重复项

时间:2019-03-04 14:21:15

标签: c# linq

我有以下数据:

DATE       TYPE CUST     PRAC    CUTR        ACTI
2018-02-22,HOME,9481    ,10     ,29204.0    ,QUS
2018-02-22,HOME,9481    ,23     ,39204.0    ,QUS
2018-02-22,HOME,9481    ,64     ,29204.0    ,QUS
2018-02-25,HOME,9481    ,35     ,49533.0    ,QUS
2018-02-25,HOME,9481    ,52     ,29452.0    ,QUS
2018-02-25,HOME,9481    ,52     ,29446.0    ,QUS
2018-02-25,HOME,9481    ,25     ,29532.0    ,QUS
2018-02-27,HOME,9481    ,52     ,29665.0    ,QUS
2018-02-27,HOME,9481    ,45     ,29664.0    ,QUS

2018-02-21,HOME,7540    ,53     ,29205.0    ,QUS
2018-02-22,HOME,7540    ,35     ,39205.0    ,QUS

在以上数据中,有两个客户:9841和7540。

我需要选择具有最新DATE的记录。一旦获得了具有最新日期的记录,那么它应该选择具有最高CUTR值的记录。

这是我到目前为止的问题:

List<clsCustomer> lstCustomer = (from row in lstCustomer
                                 group row by row.cust into g
                                 let maxDate = g.Max(r => r.date)
                                 from rowGroup in g
                                 where rowGroup.date == maxDate
                                 select rowGroup).ToList();

以下是返回的结果:

DATE       TYPE CUST     PRAC    CUTR        ACTI
2018-02-27,HOME,9481    ,52     ,29665.0    ,QUS
2018-02-27,HOME,9481    ,45     ,29664.0    ,QUS
2018-02-22,HOME,7540    ,35     ,39205.0    ,QUS

请注意,为客户9481返回了两行。每个客户应该只返回了一条记录。 (最新日期,则是最高CUTR)。

这应该是返回的正确结果。注意,它应该为每个客户获取最新日期。然后从结果中获得最高的CUTR:

DATE       TYPE CUST     PRAC    CUTR        ACTI
2018-02-27,HOME,9481    ,52     ,29665.0    ,QUS
2018-02-22,HOME,7540    ,35     ,39205.0    ,QUS

我快到了,但是不知道如何删除多余的行。任何帮助将不胜感激。

答案

谢谢哈比卜和大家的回答:

var lstCustomer = (from row in lstCustomer
                   group row by row.cust into g
                   let maxDate = g.Max(r => r.date)
                   select g.Where(e => e.date == maxDate).OrderByDescending(e => e.cutr)
                   .FirstOrDefault()).ToList();

2 个答案:

答案 0 :(得分:1)

  

您忘记了cutr子句。您已经在g中的rowGroup中执行了操作,其中   rowGroup.date == maxDate选择rowGroup,只需再添加一个   声明的可爱。而且即使您只需要一行   可能有2个具有相同的CUTR。   @迈克·马卡罗夫

var lstCustomer  = from a in lstCustomer
                group a by a.cust into g
                let maxDate = g.Max(r => r.date)
                select g.Where(e => e.date == maxDate).OrderByDescending(e => e.cutr)
                .FirstOrDefault();

希望它能起作用

答案 1 :(得分:0)

您不是在CUTR列上设置条件,而只是获得具有MAXDATE条件的行,在本示例中该行给出了两行。

您应按以下方式替换查询:
    从lstCustomer中的行     将一行一行地分组到g     让maxDate = g.Max(r => r.date)     令maxCUTR = g.Max(r => r.CUTR)     来自g中的rowGroup     其中rowGroup.date == maxDate && rowGroup.CUTR == maxCUTR     选择rowGroup