简体   繁体   English

Linq 获取最大日期,返回具有最大日期的记录列表

[英]Linq get max date, return list of records with max date

I would like to retrieve a list of records the given Year, class for the latest effective date.我想检索给定年份 class 的最新生效日期的记录列表。

grouping by Class, Year, RangeMin, RangeMax按 Class、年份、RangeMin、RangeMax 分组

Id   Class...Year...EffectiveDate...Value...RangeMin...RangeMax

1.  A.......2019....2019/1/1.........850......1.........100 

2.  A.......2019....2019/1/15........840......1.........100  

3.  A.......2019....2019/2/1.........550......101.......200  

4.  B.......2019....2019/1/5.........540......1.........100  

5.  B.......2020....2019/1/5.........650......1.........100  

6.  B.......2020....2019/5/1.........670......101.......200  

7.  B.......2020....2019/5/2.........680......101.......200

So if I'm querying for all records which are class A and year 2019 to return a list of rows: 2,3因此,如果我要查询 class A 和 2019 年的所有记录以返回行列表:2,3

If I'm querying for all records which are class B and year 2020 to return a list of rows: 5,7如果我要查询 class B 和 2020 年的所有记录以返回行列表:5,7

var recordsInDb = (from record in context.records where record.Year == year & record.Class == class_ select record).ToList();

So far I have been able to get a list of all the records for given year, class.到目前为止,我已经能够获得给定年份的所有记录的列表,class。 I know I could add a order by descending on the effective date.我知道我可以通过按生效日期递减来添加订单。 Yet that still returns all the records not just the ones which have the highest effective date.然而,这仍然会返回所有记录,而不仅仅是那些具有最高生效日期的记录。

Try following:尝试以下操作:

            DataTable dt = new DataTable();
            dt.Columns.Add("Id", typeof(int));
            dt.Columns.Add("Class", typeof(string));
            dt.Columns.Add("Year", typeof(int));
            dt.Columns.Add("EffectiveDate", typeof(DateTime));
            dt.Columns.Add("Value", typeof(int));
            dt.Columns.Add("RangeMin", typeof(int));
            dt.Columns.Add("RangeMax", typeof(int));

            dt.Rows.Add(new object[] {1, "A", 2019, DateTime.Parse("2019/1/1"), 850,1, 100}); 
            dt.Rows.Add(new object[] {2, "A", 2019, DateTime.Parse("2019/1/15"), 840,1, 100}); 
            dt.Rows.Add(new object[] {3, "A", 2019, DateTime.Parse("2019/2/1"), 550,101, 200}); 
            dt.Rows.Add(new object[] {4, "B", 2019, DateTime.Parse("2019/1/5"), 540,1, 100}); 
            dt.Rows.Add(new object[] {5, "B", 2020, DateTime.Parse("2019/1/5"), 650,1, 100}); 
            dt.Rows.Add(new object[] {6, "B", 2020, DateTime.Parse("2019/5/1"), 670,101, 200}); 
            dt.Rows.Add(new object[] {7, "B", 2020, DateTime.Parse("2019/5/2"), 680,101, 200});

            DataTable results = dt.AsEnumerable()
                .OrderByDescending(x => x.Field<int>("Year"))
                .ThenByDescending(x => x.Field<DateTime>("EffectiveDate"))
                .GroupBy(x => new { cl = x.Field<string>("Class"), month = new DateTime(x.Field<DateTime>("EffectiveDate").Year, x.Field<DateTime>("EffectiveDate").Month, 1) })
                .Select(x => x.FirstOrDefault())
                .CopyToDataTable();

You can just group by your criteria and then select the latest from each group.您可以按您的标准进行分组,然后 select 从每个组中获取最新信息。

Using query syntax:使用查询语法:

var recordsInDb = (from record in context.records
                   where record.Year == year & record.Class == class_
                   group record by new { record.Year, record.Class, record.RangeMin, record.RangeMax } into rg
                   select (
                        from record in rg
                        orderby record.EffectiveDate
                        select record
                   ).Last()
                  )
                  .ToList();

I think it is a little easier to follow using Fluent/lambda syntax since the Last requires it anyway:我认为使用 Fluent/lambda 语法更容易理解,因为Last无论如何都需要它:

var ans = context.records.Where(r => r.Year == year && r.Class == class_)
                         .GroupBy(r => new { r.Year, r.Class, r.RangeMin, r.RangeMax })
                         .Select(rg => rg.OrderBy(r => r.EffectiveDate).Last())
                         .ToList();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM