LINQ获取数组中最新项目的数组

Posted

技术标签:

【中文标题】LINQ获取数组中最新项目的数组【英文标题】:LINQ to get array of newest items in array 【发布时间】:2021-06-02 10:06:58 【问题描述】:

我有一个像这样的对象的列表:

public class ReportViewModel

    public string DocumentName  get; set;  = string.Empty;
    public DateTime? DocumentDate  get; set; 
    public string DocumentTypeName  get; set;  = string.Empty;

我想获得不同的对象列表,其中我将根据文档类型获取最新文档,并且只获取每种类型的最新文档。该api当前返回带有文档的列表,它可能来自相同文档类型但来自不同日期的文档,我怎样才能只获取每种文档类型的最新文档?

【问题讨论】:

【参考方案1】:

您需要同时使用GroupByFirstOrDefault

假设你有

  Name              DocumentDate      DocumentTypeName   
-------------------------------------------------------
 Document A-1        2021-05-01          A          
 Document A-2        2021-04-28          A
 Document B-1        2021-05-01          B          
 Document B-2        2021-04-28          B
 Document C-1        2021-05-01          C          
 Document C-2        2021-04-28          C
 Document C-3        2021-04-25          C

那么你需要做的是

 var groupedList = reportViewModelList.GroupBy(i => i.DocumentTypeName)
                .Select(i => i.OrderByDescending(o => o.DocumentDate).FirstOrDefault());

它按预期为您提供以下结果。

  Name              DocumentDate      DocumentTypeName   
-------------------------------------------------------
 Document A-1        2021-05-01          A
 Document B-1        2021-05-01          B
 Document C-1        2021-05-01          C

见:How to get first record in each group using Linq

【讨论】:

【参考方案2】:

您可以使用以下代码按上次创建时间区分元素:

using (var db = new YourDocumentDbContext())

var documents = db.Documents.AsEnumerable().GroupBy(a => a.DocumentTypeName).Select(a => a.OrderByDescending(a=>a.createdTime).FirstOrDefault());

【讨论】:

它与“如何才能从每种文档类型中仅获取最新文档”这个问题有什么联系? 好的,很抱歉这个答案。代码块返回一个列表。条目中的行已修改。

以上是关于LINQ获取数组中最新项目的数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 排序后获取集合中项目的新索引

从客户端的对象数组中获取最新日期的优雅方法是啥?

是否有更简洁的 linq 方式来“联合”单个项目?

使用Linq查找C#通用列表中的最新项目

如何使用 LINQ 的 AsQueryable() 从 MongoDB 的内部数组中获取数据?

LINQ:获取包含具有特定名称和值的属性的数组中的对象